首頁 >資料庫 >mysql教程 >如何複製 MySQL 中的 CROSS APPLY 功能?

如何複製 MySQL 中的 CROSS APPLY 功能?

Barbara Streisand
Barbara Streisand原創
2024-12-09 11:01:06846瀏覽

How to Replicate CROSS APPLY Functionality in MySQL?

MySQL 中的CROSS/OUTER APPLY

MySQL 本身不支援CROSS APPLY 語法,這在嘗試執行某些操作時可能是一個挑戰。這個問題的中心是找到一個與以下 CROSS APPLY 查詢等效的 MySQL:

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.<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
        )

如果像本例一樣,只需要目標表中的單個字段,則聯接with子查詢可以省略,子查詢可以直接放在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

透過使用這些方法,MySQL使用者可以實現與CROSS類似的功能在不影響查詢準確性或效率的情況下進行申請。

以上是如何複製 MySQL 中的 CROSS APPLY 功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn