Apakah ada persamaan MySQL dengan klausa WITH di Oracle?
Tidak ada. Kecuali (sampai) orang mengembangkannya (MySQL adalah open-source, siapa pun dapat berkontribusi.)
Kata kunci ANSI / ISO SQL WITH
digunakan untuk mendefinisikan Common Table Expressions (CTEs) dan menyederhanakan kueri kompleks dengan satu atau beberapa referensi bersarang. Ini tersedia di Oracle, Postgres, SQL-Server, DB2 tetapi tidak di MySQL.
Kueri akhir mungkin memiliki referensi (biasanya dalam FROM
klausa tetapi mereka bisa di bagian lain) kepada siapa pun dari ekspresi tabel umum, satu kali atau lebih. Kueri dapat ditulis (tanpa CTE) di MySQL menggunakan tabel turunan tetapi referensi harus dibuat berulang kali.
Contoh permintaan konyol yang menunjukkan semua orang yang lahir di tahun 50-an dan di bulan Juli dan jumlah semua orang yang lahir di tahun yang sama:
WITH a AS
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
)
, b AS
( SELECT birthyear, COUNT(*) AS cnt
FROM a
GROUP BY birthyear
)
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM a JOIN b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
Dalam MySQL, dapat ditulis sebagai:
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS a
JOIN
( SELECT birthyear, COUNT(*) AS cnt
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS aa
GROUP BY birthyear
) AS b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
Perhatikan duplikasi kode untuk tabel yang diturunkan a
. Dalam pertanyaan yang lebih kompleks, kode harus ditulis beberapa kali.
Itu akan bekerja tetapi sangat disayangkan itu tidak akan memberikan keuntungan menggunakan klausa DENGAN, yaitu tidak mengeksekusi query yang sama beberapa kali (dengan pertanyaan kompleks bisa sangat lambat dan sangat menuntut untuk mesin database; Saya mengalaminya) .
Saya akan menyarankan memasukkan setiap SELECT didefinisikan dalam klausa DENGAN asli ke dalam tabel sementara sendiri, dan menggunakannya di dalam kueri . Di MySQL, tabel sementara akan turun sendiri setelah sesi pengguna berakhir.
EDIT:
Saya baru saja melihat jawaban ini di utas serupa yang dengan jelas memaparkan 3 solusi dengan MySQL :
/programming//a/1382618/2906290
dan contoh prosedur MySQL yang membuat dan menjatuhkan tabel sementara jika Anda melanjutkan sesi Anda dan ingin membebaskan sumber daya tersebut (saya akan menggunakannya hanya sebagai contoh sintaks): /programming//a/ 5553145/2906290
sumber