Setara dengan MySQL dalam oracle

12

Apakah ada persamaan MySQL dengan klausa WITH di Oracle?

Neeru Sharma
sumber

Jawaban:

16

Tidak ada. Kecuali (sampai) orang mengembangkannya (MySQL adalah open-source, siapa pun dapat berkontribusi.)

Kata kunci ANSI / ISO SQL WITHdigunakan 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 FROMklausa 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.

ypercubeᵀᴹ
sumber
Untuk menghindari pengulangan (duplikasi kode), Bukankah lebih baik menggunakan variabel dan tabel sementara?
Pacerier
Saya tidak akan khawatir tentang duplikasi kode tetapi tentu saja saya akan mempertimbangkan dan mencoba versi dengan tabel sementara, untuk alasan kinerja.
ypercubeᵀᴹ
1
Mengapa Anda mengatakan bahwa Anda tidak akan khawatir tentang duplikasi kode? Ini benar-benar berantakan dan tidak  KERING .
Pacerier
1
@Pacerier KERING tidak selalu relevan dengan kode DB.
JNK
1
@ Peracer Saya tidak akan terkejut jika tidak. Mesin DB perlu membuat tebakan yang berpendidikan tentang apa yang akan bekerja paling baik sambil tetap menjamin untuk memberikan hasil yang benar. Tabel temp secara umum baik-baik saja, tetapi KERING menyebabkan kinerja yang mengerikan dalam DB dalam hal lain, seperti fungsi yang ditentukan pengguna.
JNK
2

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 :

  • Tabel SEMENTARA
  • Tabel DERIVED
  • pandangan inline (efektif apa yang mewakili klausa DENGAN - mereka dipertukarkan)

/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

Raúl Moreno
sumber