CROSS/Outer APPLY dalam MySQL
MySQL tidak menyokong sintaks CROSS APPLY secara asli, yang boleh menjadi cabaran apabila cuba melakukan operasi tertentu . Soalan ini berpusat di sekitar mencari MySQL yang setara dengan pertanyaan CROSS APPLY berikut:
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
Walaupun MySQL tidak mempunyai sokongan CROSS APPLY langsung, terdapat cara alternatif untuk mencapai fungsinya. Anggaran terdekat ialah menggunakan subkueri berkorelasi sebagai predikat dalam pertanyaan gabungan, seperti yang dilihat di bawah:
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 )
Jika, seperti dalam kes ini, hanya satu medan daripada jadual sasaran diperlukan, gabungan dengan subquery boleh diabaikan dan subquery boleh diletakkan terus 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 menggunakan pendekatan ini, pengguna MySQL boleh mencapai kefungsian yang serupa dengan CROSS APPLY tanpa menjejaskan ketepatan atau kecekapan pertanyaan mereka.
Atas ialah kandungan terperinci Bagaimana untuk Meniru Fungsi CROSS APPLY dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!