CROSS/OUTER APPLY in MySQL
MySQL unterstützt die CROSS APPLY-Syntax nicht nativ, was beim Versuch, bestimmte Vorgänge auszuführen, eine Herausforderung darstellen kann . Bei dieser Frage geht es darum, ein MySQL-Äquivalent zur folgenden CROSS APPLY-Abfrage zu finden:
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
Obwohl MySQL keine direkte CROSS APPLY-Unterstützung bietet, gibt es alternative Möglichkeiten, seine Funktionalität zu erreichen. Die beste Annäherung besteht darin, eine korrelierte Unterabfrage als Prädikat in einer Join-Abfrage zu verwenden, wie unten gezeigt:
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 )
Wenn, wie in diesem Fall, nur ein einzelnes Feld aus der Zieltabelle benötigt wird, wird der Join verwendet mit Unterabfrage kann weggelassen werden und die Unterabfrage kann direkt in der SELECT-Anweisung platziert werden:
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
Durch die Verwendung dieser Ansätze können MySQL-Benutzer eine ähnliche Funktionalität erreichen wie Cross-Apply, ohne die Genauigkeit oder Effizienz ihrer Abfragen zu beeinträchtigen.
Das obige ist der detaillierte Inhalt vonWie repliziere ich die CROSS APPLY-Funktionalität in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!