Comment utiliser des requêtes SQL imbriquées qui sont un test d'existence

Une requête renvoie des données à partir de toutes les lignes de table SQL qui répondent aux conditions de la requête. Parfois, plusieurs lignes sont returned- parfois un seul revient. Parfois, aucune des lignes de la table remplissent les conditions, et pas de lignes sont renvoyées.

Sommaire

Vous pouvez utiliser le EXISTE et PAS EXISTE prédicats d'introduire une sous-requête. Cette structure vous indique si des lignes de la table située dans la sous-requête de DE clause de répondre aux conditions de son clause.

EXISTE et PAS EXISTE sous-requêtes sont des exemples de sous-requêtes corrélées.

UN requête corrélée trouve d'abord la table et de la ligne spécifiée par l'instruction d'enceinte et exécute la sous-requête sur la ligne dans le tableau de la sous-requête qui est en corrélation avec la ligne actuelle de la table de la déclaration d'enceinte alors.

La sous-requête renvoie soit une ou plusieurs lignes ou il retourne pas. Si elle retourne au moins une rangée, la EXISTE prédicat réussit, et la déclaration enfermant exerce son action. Dans les mêmes conditions, la PAS EXISTE prédicat échoue, et la déclaration d'enceinte ne fonctionne pas son action.




Après une rangée de la table de la déclaration d'enceinte est traitée, la même opération est effectuée sur la ligne suivante. Cette action est répétée jusqu'à ce que chaque ligne de la table de la déclaration d'enceinte a été traitée.

EXISTE

Supposons que vous êtes un vendeur pour Zetec Corporation et que vous souhaitez appeler votre peuple de contact primaires à l'ensemble des organisations de la clientèle de Zetec en Californie. Essayez la requête suivante:

SELECT * FROM CONTACTWHERE existe (SELECT * FROM CUSTOMERWHERE CustState = 'CA'AND CONTACT.CustID = CUSTOMER.CustID) -

Remarquez la référence à CONTACT.CustID, référence qui est une colonne de la requête externe et comparer avec une autre colonne, CUSTOMER.CustID, de la requête interne. Pour chaque ligne de candidat de la requête externe, vous évaluez la requête interne, en utilisant le CustID la valeur de courant CONTACT ligne de la requête externe dans le clause de la requête interne.

Voici ce qui arrive:

  1. La CustID colonne relie la table de contact pour la table CLIENT.

  2. SQL regarde le premier enregistrement de la table de contact, trouve la ligne de la table à la clientèle qui a le même CustID, et vérifie que la ligne de CustState champ.

  3. Si CUSTOMER.CustState = 'CA', le courant CONTACT ligne est ajoutée à la table de résultat.

  4. Le prochain CONTACT enregistrement est alors traitée de la même manière, et ainsi de suite, jusqu'à ce que la totalité de la table de contact a été traitée.

  5. Parce que les précise de la requête SELECT * DE CONTACT, tous les champs de la table Contact sont retournés, y compris le nom du contact et le numéro de téléphone.

PAS EXISTE

Le vendeur Zetec veut connaître les noms et les numéros des personnes de contact de tous les clients en Californie. Imaginez une seconde que vendeur est responsable de tous les Etats-Unis, sauf en Californie. Elle peut récupérer son peuple de contact à l'aide PAS EXISTE dans une requête similaire à la précédente:

SELECT * FROM CONTACTWHERE NOT EXISTS (SELECT * FROM CUSTOMERWHERE CustState = 'CA'AND CONTACT.CustID = CUSTOMER.CustID) -

Chaque ligne de contact pour laquelle la sous-requête ne renvoie pas une ligne est ajoutée à la table de résultat.


» » » » Comment utiliser des requêtes SQL imbriquées qui sont un test d'existence