Rumah >pangkalan data >tutorial mysql >Bagaimanakah Subqueries Berkorelasi Boleh Menggantikan CROSS APPLY dalam MySQL?

Bagaimanakah Subqueries Berkorelasi Boleh Menggantikan CROSS APPLY dalam MySQL?

Susan Sarandon
Susan Sarandonasal
2024-12-05 01:33:22721semak imbas

How Can Correlated Subqueries Replace CROSS APPLY in MySQL?

CROSS/OUTER APPLY dalam MySQL

Walaupun menjadi operator yang digunakan secara meluas dalam T-SQL, MySQL tidak menyokong sintaks CROSS APPLY secara asli . Ini boleh memberikan cabaran kepada pembangun yang perlu menggunakan keupayaan CROSS APPLY dalam persekitaran MySQL.

Memahami SUBQUERI TERKAIT

Dalam MySQL, pendekatan biasa untuk menghampiri kefungsian CROSS APPLY adalah untuk menggunakan subkueri berkorelasi. Subkueri berkorelasi ialah subkueri yang merujuk lajur daripada pertanyaan luar. Dengan membenamkan subkueri berkorelasi dalam pernyataan SELECT atau syarat sertai, anda boleh mencapai hasil yang serupa dengan CROSS APPLY.

Contoh 1: Menyertai Subquery Berkorelasi sebagai Predikat

Pertimbangkan pertanyaan berikut, yang cuba menggunakan CROSS APPLY untuk mendapatkan nilai tertentu daripada ORD_HISTORY jadual:

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

Disebabkan kekurangan sokongan CROSS APPLY MySQL, pendekatan yang lebih sesuai ialah menggunakan gabungan dengan subkueri berkorelasi sebagai predikat:

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
        )

Dalam pertanyaan ini, subquery berkorelasi digunakan untuk mengambil nilai yang sesuai daripada ORD_HISTORY dan membenamkannya sebagai gabungan keadaan.

Contoh 2: Menggunakan Subkueri Berkorelasi Secara Terus dalam Pernyataan SELECT

Dalam kes di mana hanya satu medan daripada jadual sasaran diperlukan, subkueri berkorelasi boleh digabungkan terus ke dalam pernyataan 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

Dengan memanfaatkan subkueri berkorelasi, pembangun boleh dengan berkesan anggaran kefungsian CROSS APPLY dalam MySQL, membolehkan mereka melakukan operasi pengambilan data yang kompleks walaupun tanpa sokongan CROSS APPLY asli.

Atas ialah kandungan terperinci Bagaimanakah Subqueries Berkorelasi Boleh Menggantikan CROSS APPLY dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn