Istruzione di selezione nidificata in SQL Server


389

Perché il seguente non funziona?

SELECT name FROM (SELECT name FROM agentinformation)

Immagino che la mia comprensione di SQL sia sbagliata, perché avrei pensato che questo avrebbe restituito la stessa cosa di

SELECT name FROM agentinformation

L'istruzione select interna non crea un set di risultati che l'istruzione SELECT esterna quindi interroga?

Risposte:


674

È necessario alias la subquery.

SELECT name FROM (SELECT name FROM agentinformation) a  

o per essere più espliciti

SELECT a.name FROM (SELECT name FROM agentinformation) a  

76
Assicurati che anche il tuo alias sia in qualche modo dettagliato! Adoro quando riesco a lavorare su una fabbrica di birra con t1, t2, t3, t4, t5, t6
Doug Chamberlain,

2
Dove andrebbe una whereclausola per la query esterna?
Colonnello Panic,

3
@ColonelPanic: la clausola WHERE per la query esterna verrebbe applicata alla fine.
Joe Stefanelli,

"Giusto, sono un idiota! Grazie, accetterò una volta permesso." Nah. Solo ignorante. Come tutti noi
Lucio Mollinedo,

2
Oracle accetta il primo selectsenza l'alias.
Kjetil S.

49

La risposta fornita da Joe Stefanelli è già corretta.

SELECT name FROM (SELECT name FROM agentinformation) as a  

Dobbiamo creare un alias della sottoquery perché una query necessita di un oggetto tabella che otterremo dalla creazione di un alias per la sottoquery. Concettualmente, i risultati della sottoquery vengono sostituiti nella query esterna. Poiché è necessario un oggetto tabella nella query esterna, è necessario creare un alias della query interna.

Le dichiarazioni che includono una sottoquery di solito assumono una di queste forme:

  • Espressione WHERE [NOT] IN (sottoquery)
  • DOVE espressione compare_operator [ANY | TUTTO] (sottoquery)
  • DOVE [NON] ESISTE (sottoquery)

Controlla altre regole di subquery e tipi di subquery .

Altri esempi di sottoquery nidificate.

  1. IN / NOT IN - Questo operatore prende l'output della query interna dopo l'esecuzione della query interna che può essere zero o più valori e la invia alla query esterna. La query esterna quindi recupera tutte le righe [operatore IN] corrispondenti o non corrispondenti [operatore NOT IN].

  2. ANY - [> ANY o ANY accetta l'elenco dei valori prodotti dalla query interna e recupera tutti i valori maggiori del valore minimo dell'elenco. Il

ad es.> ANY (100.200.300), l'operatore ANY prenderà tutti i valori maggiori di 100.

  1. ALL - [> L'operatore ALL o ALL prende l'elenco dei valori prodotti dalla query interna e recupera tutti i valori maggiori del massimo dell'elenco. Il

ad es.> ALL (100.200.300), l'operatore ALL recupererà tutti i valori maggiori di 300.

  1. EXISTS - La parola chiave EXISTS produce un valore booleano [TRUE / FALSE]. Questo EXISTS verifica l'esistenza delle righe restituite dalla query secondaria.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.