Zagnieżdżona instrukcja select w SQL Server

387

Dlaczego poniższe działania nie działają?

SELECT name FROM (SELECT name FROM agentinformation)

Wydaje mi się, że moje rozumienie SQL jest błędne, ponieważ myślałem, że zwróci to samo, co

SELECT name FROM agentinformation

Czy wewnętrzna instrukcja select nie tworzy zestawu wyników, który zewnętrzna instrukcja SELECT wysyła następnie do zapytania?

Brennan Vincent
źródło

Odpowiedzi:

672

Musisz alias podkwerendy.

SELECT name FROM (SELECT name FROM agentinformation) a  

lub bardziej precyzyjnie

SELECT a.name FROM (SELECT name FROM agentinformation) a  
Joe Stefanelli
źródło
76
Upewnij się, że twój alias też jest nieco gadatliwy! Uwielbiam, gdy zabieram się do pracy przy wuery z t1, t2, t3, t4, t5, t6
Doug Chamberlain
2
Gdzie mogłaby znaleźć się whereklauzula dla zewnętrznego zapytania?
Pułkownik Panic
3
@ ColonelPanic: klauzula WHERE dla zewnętrznego zapytania zostanie rozwiązana na samym końcu.
Joe Stefanelli
„Racja, jestem idiotką! Dzięki, zaakceptuję, gdy tylko pozwolę”. Nie Po prostu ignorancki. Tak jak my wszyscy.
Lucio Mollinedo,
2
Oracle akceptuje pierwszy selectbez aliasu.
Kjetil S.,
49

Odpowiedź udzielana przez Joe Stefanelli jest już prawidłowa.

SELECT name FROM (SELECT name FROM agentinformation) as a  

Musimy utworzyć alias podzapytania, ponieważ zapytanie wymaga obiektu tabeli, który otrzymamy po utworzeniu aliasu dla podzapytania. Koncepcyjnie wyniki podzapytania są podstawiane w zewnętrznym zapytaniu. Ponieważ potrzebujemy obiektu tabeli w zewnętrznym zapytaniu, musimy utworzyć alias wewnętrznego zapytania.

Instrukcje zawierające podzapytanie zwykle przyjmują jedną z następujących form:

  • GDZIE wyrażenie [NOT] IN (podzapytanie)
  • GDZIE wyrażenie wyrażenie_operator [DOWOLNY | WSZYSTKIE] (podzapytanie)
  • GDZIE [NIE] ISTNIEJE (podzapytanie)

Sprawdź więcej reguł i typów podkwerend .

Więcej przykładów zagnieżdżonych zapytań.

  1. IN / NOT IN - Ten operator pobiera dane wyjściowe zapytania wewnętrznego po wykonaniu zapytania wewnętrznego, które może mieć zero lub więcej wartości, i wysyła je do zapytania zewnętrznego. Zapytanie zewnętrzne pobiera następnie wszystkie pasujące wiersze [operator IN] lub niepasujące wiersze [operator NOT IN].

  2. DOWOLNY - [> DOWOLNY lub DOWOLNY operator pobiera listę wartości wygenerowanych przez zapytanie wewnętrzne i pobiera wszystkie wartości, które są większe niż minimalna wartość listy. The

np.> DOWOLNY (100,200,300), DOWOLNY operator pobierze wszystkie wartości większe niż 100.

  1. ALL - [> ALL lub ALL operator pobiera listę wartości wygenerowanych przez zapytanie wewnętrzne i pobiera wszystkie wartości, które są większe niż maksimum listy. The

np.> ALL (100 200 300), operator ALL pobierze wszystkie wartości większe niż 300.

  1. EXISTS - słowo kluczowe EXISTS tworzy wartość logiczną [TRUE / FALSE]. Ta ISTNIEJE sprawdza istnienie wierszy zwróconych przez zapytanie podrzędne.
Somnath Muluk
źródło