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 SELECTdeyiminin 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 SELECTsorgusu, genel olarak bir çıkıntı (oluşur SELECTparçası) bir dizi JOINoperasyon ( JOINparçası), belirli bir sayıda SELECTION işlemleri (SQL, WHEREhükümler) ve sonra da set-bazlı (operasyonlar UNION, EXCEPT, INTERSECTve benzeri), bir diğeri ile ve ardından SQL SELECTsorgusu.
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) SELECTbir 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 bybir cevap olarak koymadım.
ONmadde için gerekli JOIN, ancak virgülle bir çapraz ürün elde edilmesine rağmen.