SQL ha bisogno di subquery?
Immagina un'implementazione sufficientemente generalizzata del linguaggio di query strutturato per i database delle relazioni. Dal momento che la struttura dell'istruzione canonica SQL SELECT
è in realtà abbastanza importante perché ciò abbia un senso, non mi rivolgo direttamente all'algebra relazionale, ma potresti inquadrarla in quei termini facendo appropriate restrizioni sulla forma delle espressioni.
Uno SQL SELECT
interrogazione è generalmente costituito da una sporgenza (la SELECT
parte) un numero di JOIN
operazioni (la JOIN
parte), un numero di SELECTION
operazioni (in SQL, le WHERE
clausole), e quindi impostare-wise operazioni ( UNION
, EXCEPT
, INTERSECT
, ecc), seguita da un'altra SELECT
Query SQL .
Le tabelle che vengono unite possono essere i risultati calcolati delle espressioni; in altre parole, possiamo avere una dichiarazione come:
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;
Faremo riferimento all'uso di una tabella calcolata come parte di una query SQL come sottoquery. Nell'esempio sopra, il secondo (rientrato) SELECT
è una sottoquery.
Tutte le query SQL possono essere scritte in modo da non utilizzare le query secondarie? L'esempio sopra può:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Questo esempio è in qualche modo spurio o banale, ma si possono immaginare casi in cui potrebbe essere necessario uno sforzo considerevolmente maggiore per recuperare un'espressione equivalente. In altre parole, è possibile che per ogni query SQL con subquery, esista una query q ′ senza subquery tale che q e q ′ garantiscano che producano gli stessi risultati per le stesse tabelle sottostanti? Limitiamo le query SQL al seguente modulo:
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 ...
E così via. Penso che i join esterni destro e sinistro non aggiungano molto, ma se sbaglio, sentitevi liberi di segnalarlo ... in ogni caso, sono anche un gioco leale. Per quanto riguarda le operazioni impostate, suppongo che tutte vadano bene ... unione, differenza, differenza simmetrica, intersezione, ecc ... qualsiasi cosa sia utile. Esistono moduli noti a cui è possibile ridurre tutte le query SQL? Qualcuno di questi elimina le subquery? Oppure ci sono alcuni casi in cui non esiste una query equivalente e senza subquery? I riferimenti sono apprezzati ... o una dimostrazione (per prova) che sono o non sono richiesti sarebbe fantastica. Grazie e scusate se questo è un risultato celebrato (o banale) di cui sono dolorosamente ignorante.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Perché include group by
non ho inserito questo come una risposta.
ON
clausola è richiesta per JOIN
s, sebbene un prodotto incrociato sia ottenuto con solo una virgola.