Maison >base de données >tutoriel mysql >Comment les sous-requêtes corrélées peuvent-elles remplacer CROSS APPLY dans MySQL ?

Comment les sous-requêtes corrélées peuvent-elles remplacer CROSS APPLY dans MySQL ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 01:33:22724parcourir

How Can Correlated Subqueries Replace CROSS APPLY in MySQL?

CROSS/OUTER APPLY dans MySQL

Bien qu'il s'agisse d'un opérateur largement utilisé dans T-SQL, MySQL ne prend pas en charge nativement la syntaxe CROSS APPLY . Cela peut présenter un défi pour les développeurs qui doivent utiliser les capacités de CROSS APPLY dans les environnements MySQL.

Comprendre les sous-requêtes corrélées

Dans MySQL, une approche commune pour rapprocher les fonctionnalités de CROSS APPLY consiste à utiliser des sous-requêtes corrélées. Une sous-requête corrélée est une sous-requête qui fait référence aux colonnes de la requête externe. En intégrant une sous-requête corrélée dans une instruction SELECT ou une condition de jointure, vous pouvez obtenir des résultats similaires à CROSS APPLY.

Exemple 1 : Joindre avec une sous-requête corrélée en tant que prédicat

Considérez la requête suivante, qui tente d'utiliser CROSS APPLY pour récupérer une valeur spécifique de ORD_HISTORY table :

SELECT ORD.ID
    ,ORD.NAME
    ,ORD.DATE
    ,ORD_HIST.VALUE
FROM ORD
CROSS APPLY (
    SELECT TOP 1 ORD_HISTORY.VALUE
    FROM ORD_HISTORY
    WHERE ORD.ID = ORD_HISTORY.ID
        AND ORD.DATE <= ORD_HISTORY.DATE
    ORDER BY ORD_HISTORY.DATE DESC
    ) ORD_HIST

En raison du manque de support CROSS APPLY par MySQL, une approche plus appropriée consiste à utiliser une jointure avec une sous-requête corrélée comme prédicat :

SELECT
   ORD.ID
  ,ORD.NAME
  ,ORD.DATE
  ,ORD_HISTORY.VALUE
FROM
  ORD
INNER JOIN
  ORD_HISTORY
    ON  ORD_HISTORY.ID
        =
        (SELECT ORD_HISTORY.ID
           FROM ORD_HISTORY
          WHERE ORD.ID = ORD_HISTORY.ID
            AND ORD.DATE <= ORD_HISTORY.DATE
       ORDER BY ORD_HISTORY.DATE DESC
          LIMIT 1
        )

Dans cette requête, la sous-requête corrélée est utilisée pour récupérer la valeur appropriée de ORD_HISTORY et l'intégrer en tant que jointure condition.

Exemple 2 : Utilisation d'une sous-requête corrélée directement dans l'instruction SELECT

Dans les cas où un seul champ de la table cible est requis, la sous-requête corrélée peut être incorporée directement dans l'instruction SELECT :

SELECT
   ORD.ID
  ,ORD.NAME
  ,ORD.DATE
  ,(SELECT ORD_HISTORY.VALUE
      FROM ORD_HISTORY
     WHERE ORD.ID = ORD_HISTORY.ID
       AND ORD.DATE <= ORD_HISTORY.DATE
  ORDER BY ORD_HISTORY.DATE DESC
     LIMIT 1
   )   AS VALUE
FROM
  ORD

En exploitant les sous-requêtes corrélées, les développeurs peuvent se rapprocher efficacement de la fonctionnalité CROSS APPLY dans MySQL, permettant leur permettant d'effectuer des opérations complexes de récupération de données même en l'absence de support natif CROSS APPLY.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn