MySQL 中的CROSS/OUTER APPLY
儘管是T-SQL 中廣泛使用的運算符,但MySQL 本身並不支援CROSS APPLY 語法。這對於需要在 MySQL 環境中利用 CROSS APPLY 功能的開發人員來說是一個挑戰。
理解相關子查詢
在 MySQL 中,一種近似 CROSS APPLY 功能的常見方法是使用相關子查詢。相關子查詢是引用外部查詢中的列的子查詢。透過在 SELECT 語句或聯結條件中嵌入相關子查詢,您可以獲得與 CROSS APPLY 類似的結果。
範例1:使用相關子查詢作為謂詞進行連結
考慮下列查詢嘗試使用CROSS APPLY 從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
由於MySQL 缺乏CROSS APPLY支持,更合適的做法是使用帶有相關子查詢的連接作為謂詞:
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 )
在此查詢中,相關子查詢用於從 ORD_HISTORY中取得適當的值並將其嵌入作為聯接
範例2:在SELECT語句中直接使用關聯子查詢
如果只需要目標表中的單一欄位,可以合併關聯子查詢直接進入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
透過利用相關子查詢,開發人員可以有效地近似CROSS APPLY MySQL 中的功能,使它們即使在沒有本機 CROSS APPLY 支援的情況下也能夠執行複雜的資料擷取操作。
以上是MySQL中相關子查詢如何取代CROSS APPLY?的詳細內容。更多資訊請關注PHP中文網其他相關文章!