Benötigt SQL Unterabfragen?
Stellen Sie sich eine ausreichend verallgemeinerte Implementierung der strukturierten Abfragesprache für Beziehungsdatenbanken vor. Da die Struktur der kanonischen SQL- SELECTAnweisung eigentlich ziemlich wichtig ist, damit dies sinnvoll ist, appelliere ich nicht direkt an die relationale Algebra, aber Sie könnten dies in diesen Begriffen einrahmen, indem Sie die Form der Ausdrücke entsprechend einschränken.
Eine SQL - SELECTAbfrage besteht im allgemeinen aus einem Vorsprung (der SELECTTeil) eine bestimmte Anzahl von JOINOperationen (der JOINTeil), eine bestimmte Anzahl von SELECTION Operationen (in SQL, die WHEREKlauseln), und dann gesetzt weise Operationen ( UNION, EXCEPT, INTERSECT, etc.), gefolgt von einem anderen SQL- SELECTAbfrage.
Tabellen, die verknüpft werden, können die berechneten Ergebnisse von Ausdrücken sein. Mit anderen Worten, wir können eine Aussage haben wie:
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;
Wir werden uns auf die Verwendung einer berechneten Tabelle als Teil einer SQL-Abfrage als Unterabfrage beziehen. Im obigen Beispiel ist die zweite (eingerückte) SELECTeine Unterabfrage.
Können alle SQL-Abfragen so geschrieben werden, dass keine Unterabfragen verwendet werden? Das obige Beispiel kann:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Dieses Beispiel ist etwas fälschlich oder trivial, aber man kann sich Fälle vorstellen, in denen erheblich mehr Aufwand erforderlich ist, um einen äquivalenten Ausdruck wiederherzustellen. Mit anderen Worten, gibt es für jede SQL-Abfrage mit Unterabfragen eine Abfrage ohne Unterabfragen, so dass und garantiert dieselben Ergebnisse für dieselben zugrunde liegenden Tabellen liefern? Beschränken wir SQL-Abfragen auf das folgende Formular:
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 ...
Und so weiter. Ich denke, linke und rechte äußere Verknüpfungen tragen nicht viel dazu bei, aber wenn ich mich irre, können Sie gerne darauf hinweisen ... auf jeden Fall handelt es sich auch um faires Spiel. Was die Mengenoperationen angeht, sind wohl alle in Ordnung ... Vereinigung, Differenz, symmetrische Differenz, Schnittmenge usw. ... alles, was hilfreich ist. Gibt es bekannte Formen, auf die alle SQL-Abfragen reduziert werden können? Beseitigen diese Unterabfragen? Oder gibt es Fälle, in denen keine äquivalente Abfrage ohne Unterabfrage vorhanden ist? Referenzen sind erwünscht ... oder eine Demonstration (durch Nachweis), dass sie erforderlich sind oder nicht, wäre fantastisch. Danke, und tut mir leid, wenn dies ein gefeiertes (oder triviales) Ergebnis ist, von dem ich schmerzlich nichts weiß.
select count(*) from (select id from sometable group by id having count(*)>1) d. Weil es beinhaltet, habe group byich dies nicht als Antwort gegeben.
ONKlausel für JOINs erforderlich , obwohl ein Kreuzprodukt nur mit einem Komma erhalten wird.