Maison >base de données >tutoriel mysql >Comment répliquer la fonctionnalité CROSS/OUTER APPLY dans MySQL ?

Comment répliquer la fonctionnalité CROSS/OUTER APPLY dans MySQL ?

DDD
DDDoriginal
2024-12-07 13:07:16486parcourir

How to Replicate CROSS/OUTER APPLY Functionality in MySQL?

CROSS/OUTER APPLY dans MySQL

MySQL ne prend pas en charge directement la syntaxe CROSS APPLY, mais des approches alternatives peuvent être utilisées pour obtenir des fonctionnalités similaires .

Imbriqué Sous-requête :

Dans MySQL, une alternative courante consiste à utiliser une sous-requête corrélée comme prédicat dans une instruction JOIN. Cela garantit que les résultats de la sous-requête sont évalués pour chaque ligne de la requête externe.

Exemple :

Étant donné la requête :

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

La requête équivalente utilisant une sous-requête imbriquée serait :

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

Direct Sous-requête :

Dans les cas où un seul champ de la table cible est requis, une sous-requête corrélée peut être directement intégrée 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

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