Benötigt SQL Unterabfragen?
Stellen Sie sich eine ausreichend verallgemeinerte Implementierung der strukturierten Abfragesprache für Beziehungsdatenbanken vor. Da die Struktur der kanonischen SQL- SELECT
Anweisung 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 - SELECT
Abfrage besteht im allgemeinen aus einem Vorsprung (der SELECT
Teil) eine bestimmte Anzahl von JOIN
Operationen (der JOIN
Teil), eine bestimmte Anzahl von SELECTION
Operationen (in SQL, die WHERE
Klauseln), und dann gesetzt weise Operationen ( UNION
, EXCEPT
, INTERSECT
, etc.), gefolgt von einem anderen SQL- SELECT
Abfrage.
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) SELECT
eine 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 by
ich dies nicht als Antwort gegeben.
ON
Klausel für JOIN
s erforderlich , obwohl ein Kreuzprodukt nur mit einem Komma erhalten wird.