Wie man Verschachtelte SQL-Abfragen verwenden, die eine Existenztest sind

Eine Abfrage gibt Daten aus allen SQL-Tabellenzeilen, die den Abfragebedingungen erfüllen. Manchmal viele Zeilen returned- manchmal nur eine kommt zurück. Manchmal keine der Zeilen in der Tabelle entsprechen den Bedingungen und keine Zeilen zurückgegeben werden.

Sie können die Verwendung VORHANDEN und EXISTIERT NICHT Prädikate eine Unterabfrage einzuführen. Diese Struktur zeigt an, ob irgendwelche Zeilen in der Tabelle in der Unterabfrage und befindet sich VON Klausel erfüllen die Bedingungen in ihren WOHER Klausel.

VORHANDEN und EXISTIERT NICHT Unterabfragen sind Beispiele für korrelierte Unterabfragen.

EIN korrelierte Unterabfrage zuerst findet die Tabelle und die Zeile von der umschließenden Anweisung angegeben und führt dann die Unterabfrage auf die Zeile in der Tabelle des Unterabfrage, die mit der aktuellen Zeile der umschließenden Anweisung der Tabelle korreliert.

Die Unterabfrage gibt entweder eine oder mehrere Zeilen oder es gibt keine. Wenn sie zurückkehrt mindestens eine Reihe, die VORHANDEN Prädikat gelingt, und die umschließenden Anweisung führt seine Aktion. Unter den gleichen Bedingungen, die EXISTIERT NICHT Prädikat schlägt fehl, und die umschließenden Anweisung ausführen nicht seine Wirkung.

Nach einer Zeile der Tabelle der umschließenden Anweisung verarbeitet wird, wird der gleiche Vorgang auf der nächsten Zeile durchgeführt. Diese Aktion wird wiederholt, bis jede Zeile in der Tabelle des umschließenden Anweisung verarbeitet worden ist.

VORHANDEN

Angenommen, Sie sind ein Verkäufer für Zetec Corporation und Sie möchten, dass Ihre primäre Ansprechpartner bei allen Zetec Kundenorganisationen in Kalifornien zu nennen. Versuchen Sie, die folgende Abfrage:

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

Beachten Sie den Verweis auf CONTACT.CustID, das ist eine Spalte aus der äußeren Abfrage referenziert und mit einer anderen Spalte zu vergleichen, CUSTOMER.CustID, von der inneren Abfrage. Für jede in Frage kommende Zeile der äußeren Abfrage, bewerten Sie die innere Abfrage, mit der CustID Wert aus der aktuellen KONTAKT Zeile der äußeren Abfrage in der WOHER Klausel der inneren Abfrage.

Hier ist, was passiert:

  1. Das CustID Spalte verbindet die CONTACT-Tabelle der CUSTOMER-Tabelle.

  2. SQL schaut auf den ersten Eintrag in der Kontakttabelle, findet die Zeile in der Tabelle CUSTOMER, die die gleiche ist CustID, und überprüft, ob row CustState Feld.

  3. Ob CUSTOMER.CustState = 'CA', die jetzige KONTAKT Zeile wird der Ergebnistabelle hinzugefügt.

  4. Der nächste KONTAKT Datensatz wird dann in der gleichen Weise verarbeitet, und so weiter, bis die gesamte Kontakttabelle verarbeitet wurde.

  5. Da die Abfrage gibt SELECT * FROM KONTAKT, alle Felder der Kontakttabelle zurückgegeben werden, einschließlich des Namens und der Telefonnummer des Kontakts.

EXISTIERT NICHT

Der Zetec Verkäufer will die Namen und Nummern der Ansprechpartner aller Kunden in Kalifornien kennen. Stellen Sie sich vor, dass ein zweiter Verkäufer für alle der Vereinigten Staaten außer Kalifornien verantwortlich ist. Sie kann ihre Kontaktpersonen abrufen, indem Sie EXISTIERT NICHT in einer Abfrage ähnlich wie die vorhergehende:

SELECT * FROM KONTAKTWo NICHT VORHANDEN (SELECT * FROM CUSTOMERWHERE CustState = 'CA'AND CONTACT.CustID = CUSTOMER.CustID) -

Jede Zeile in Kontakt, für die die Unterabfrage keine Zeile zurückkehrt wird in die Ergebnistabelle hinzugefügt.

Menü