Instruction de sélection imbriquée dans SQL Server

389

Pourquoi les éléments suivants ne fonctionnent-ils pas?

SELECT name FROM (SELECT name FROM agentinformation)

Je suppose que ma compréhension de SQL est erronée, car j'aurais pensé que cela retournerait la même chose que

SELECT name FROM agentinformation

L'instruction select interne ne crée-t-elle pas un jeu de résultats que l'instruction SELECT externe interroge ensuite?

Brennan Vincent
la source

Réponses:

674

Vous devez alias la sous-requête.

SELECT name FROM (SELECT name FROM agentinformation) a  

ou pour être plus explicite

SELECT a.name FROM (SELECT name FROM agentinformation) a  
Joe Stefanelli
la source
76
Assurez-vous que votre alias est quelque peu bavard aussi! J'adore quand je travaille sur un wuery avec t1, ​​t2, t3, t4, t5, t6
Doug Chamberlain
2
Où irait une whereclause pour la requête externe?
Colonel Panic
3
@ColonelPanic: La clause WHERE pour la requête externe serait ajoutée à la toute fin.
Joe Stefanelli
"D'accord, je suis un idiot! Merci, acceptera une fois permis." Non. Juste ignorant. Comme nous tous.
Lucio Mollinedo
2
Oracle accepte le premier selectsans l'alias.
Kjetil S.
49

La réponse fournie par Joe Stefanelli est déjà correcte.

SELECT name FROM (SELECT name FROM agentinformation) as a  

Nous devons créer un alias de la sous-requête car une requête a besoin d'un objet table que nous obtiendrons en créant un alias pour la sous-requête. Conceptuellement, les résultats de la sous-requête sont substitués dans la requête externe. Comme nous avons besoin d'un objet table dans la requête externe, nous devons créer un alias de la requête interne.

Les instructions qui incluent une sous-requête prennent généralement l'une de ces formes:

  • O expression l'expression [NOT] IN (sous-requête)
  • WHERE expression comparaison_opérateur [ANY | ALL] (sous-requête)
  • O [[PAS] EXISTE (sous-requête)

Recherchez d'autres règles de sous - requête et types de sous - requête .

Plus d'exemples de sous-requêtes imbriquées.

  1. IN / NOT IN - Cet opérateur prend la sortie de la requête interne après l'exécution de la requête interne qui peut être zéro ou plusieurs valeurs et l'envoie à la requête externe. La requête externe récupère ensuite toutes les lignes correspondantes [opérateur IN] ou non correspondantes [opérateur NOT IN].

  2. ANY - L'opérateur [> ANY ou ANY prend la liste des valeurs produites par la requête interne et récupère toutes les valeurs supérieures à la valeur minimale de la liste. le

Par exemple> ANY (100,200,300), l'opérateur ANY récupérera toutes les valeurs supérieures à 100.

  1. ALL - L'opérateur [> ALL ou ALL prend la liste des valeurs produites par la requête interne et récupère toutes les valeurs supérieures au maximum de la liste. le

Par exemple> ALL (100,200,300), l'opérateur ALL récupérera toutes les valeurs supérieures à 300.

  1. EXISTS - Le mot clé EXISTS produit une valeur booléenne [TRUE / FALSE]. Cet EXISTS vérifie l'existence des lignes renvoyées par la sous-requête.
Somnath Muluk
la source