SQL'in alt sorgulara ihtiyacı var mı?
İlişki veritabanları için yapılandırılmış sorgu dilinin yeterince genel bir uygulamasını hayal edin. Kanonik SQL SELECT
deyiminin yapısı aslında anlam ifade etmek için oldukça önemli olduğundan, doğrudan ilişkisel cebirlere hitap etmiyorum, ancak ifadeler biçiminde uygun kısıtlamalar yaparak bu terimlerle çerçevelendirebilirsiniz.
Bir SQL SELECT
sorgusu, genel olarak bir çıkıntı (oluşur SELECT
parçası) bir dizi JOIN
operasyon ( JOIN
parçası), belirli bir sayıda SELECTION
işlemleri (SQL, WHERE
hükümler) ve sonra da set-bazlı (operasyonlar UNION
, EXCEPT
, INTERSECT
ve benzeri), bir diğeri ile ve ardından SQL SELECT
sorgusu.
Birleştirilen tablolar ifadelerin hesaplanmış sonuçları olabilir; Başka bir deyişle, şöyle bir açıklamaya sahip olabiliriz:
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;
Hesaplanan bir tablonun bir SQL sorgusunun bir parçası olarak alt sorgu olarak kullanılmasına değineceğiz. Yukarıdaki örnekte, ikincisi (girintili) SELECT
bir alt sorundur.
Tüm SQL sorguları, alt sorguları kullanmayacak şekilde yazılabilir mi? Yukarıdaki örnek şunları yapabilir:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Bu örnek biraz taklit edici veya önemsizdir, ancak buna eşdeğer bir ifadeyi kurtarmak için çok daha fazla çaba sarf edilmesi gereken durumlar düşünülebilir. Başka bir deyişle, alt sorgulara sahip her SQL sorgusu için, aynı temel tablolarda aynı sonuçları üretecek şekilde ve nun alt sorguları olmayan bir sorgusu var mı? SQL sorgularını aşağıdaki şekilde sınırlayalım: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 ...
Ve bunun gibi. Sanırım sol ve sağ dış birleşimler fazla bir şey katmıyor, ancak yanılıyorsam, lütfen şunu belirtmekten çekinmeyin ... her halükarda, onlar da adil bir oyundur. Belirlenen operasyonlar devam ederken, bunların herhangi biri iyi ... sanırım birlik, fark, simetrik fark, kesişme, vb ... yardımcı olabilecek herhangi bir şey var. Tüm SQL sorgularının azaltılabileceği bilinen herhangi bir form var mı? Bunlardan herhangi biri alt sorguları ortadan kaldırıyor mu? Veya eşdeğeri, alt sorgu içermeyen bir sorgunun bulunmadığı bazı durumlar var mı? Referanslar takdir edilir ... veya kanıtlandıkları veya istenmediklerine dair bir gösteri harika olur. Teşekkürler ve bu acı dolu bir şekilde cahil olduğum ünlü (ya da önemsiz) bir sonucuysa üzgünüm.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Çünkü bunu group by
bir cevap olarak koymadım.
ON
madde için gerekli JOIN
, ancak virgülle bir çapraz ürün elde edilmesine rağmen.