Apakah SQL memerlukan subquery?
Bayangkan implementasi yang cukup umum dari bahasa query terstruktur untuk database relasi. Karena struktur SELECT
pernyataan SQL kanonik sebenarnya cukup penting untuk membuat ini masuk akal, saya tidak menarik langsung ke aljabar relasional, tetapi Anda bisa membingkai ini dalam istilah-istilah tersebut dengan membuat batasan yang tepat pada bentuk ekspresi.
SQL SELECT
permintaan umumnya terdiri dari proyeksi (yang SELECT
bagian) beberapa jumlah JOIN
operasi (yang JOIN
bagian), beberapa jumlah SELECTION
operasi (di SQL, WHERE
klausa), dan kemudian set-bijaksana operasi ( UNION
, EXCEPT
, INTERSECT
, dll), diikuti oleh yang lain SELECT
Permintaan SQL .
Tabel yang disatukan dapat berupa hasil ekspresi yang dikomputasi; dengan kata lain, kita dapat memiliki pernyataan seperti:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
Kami akan merujuk pada penggunaan tabel yang dihitung sebagai bagian dari kueri SQL sebagai subquery. Dalam contoh di atas, yang kedua (indentasi) SELECT
adalah subquery.
Bisakah semua query SQL ditulis sedemikian rupa agar tidak menggunakan subquery? Contoh di atas dapat:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Contoh ini agak palsu, atau sepele, tetapi orang dapat membayangkan contoh-contoh di mana upaya yang jauh lebih mungkin diperlukan untuk memulihkan ekspresi yang setara. Dengan kata lain, apakah itu kasus untuk setiap query SQL dengan subqueries, ada query tanpa subqueries sehingga dan dijamin untuk menghasilkan hasil yang sama untuk tabel dasar yang sama? Biarkan kami membatasi kueri SQL ke formulir berikut:q ′ q q ′
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
Dan seterusnya. Saya pikir gabungan luar kiri dan kanan tidak menambahkan banyak, tetapi jika saya salah, silakan tunjukkan ... dalam hal apa pun, mereka juga merupakan permainan yang adil. Sejauh operasi ditetapkan, saya kira salah satu dari mereka baik-baik saja ... penyatuan, perbedaan, perbedaan simetris, persimpangan, dll ... apa pun yang bermanfaat. Apakah ada bentuk yang diketahui dimana semua pertanyaan SQL dapat dikurangi? Apakah ada di antara ini yang menghilangkan subkueri? Atau ada beberapa contoh di mana tidak ada kueri yang setara dan bebas subquery? Referensi dihargai ... atau demonstrasi (dengan bukti) bahwa mereka diperlukan atau tidak diperlukan akan fantastis. Terima kasih, dan maaf jika ini adalah hasil yang dirayakan (atau sepele) yang saya sangat tidak tahu.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Karena itu termasuk group by
saya belum menempatkan ini sebagai jawaban.
ON
klausa diperlukan untuk JOIN
s, meskipun produk silang diperoleh hanya dengan koma.