Wie man Verschachtelte SQL-Abfragen verwenden, die Sätze von Zeilen zurück

Um darzustellen, wie eine verschachtelte SQL-Abfrage eine Reihe von Zeilen zurückgibt, sich vorstellen, dass Sie für einen Systemintegrator von EDV-Anlagen arbeiten. Ihr Unternehmen, Zetec Corporation baut Systeme aus Komponenten, die Sie kaufen, und dann verkauft sie an Unternehmen und Behörden. Sie behalten den Überblick über Ihr Unternehmen mit einer relationalen Datenbank.

Die Datenbank besteht aus vielen Tabellen, aber jetzt bist du mit nur drei von ihnen betroffen: der Produkttabelle, die COMP_USED Tabelle, und die COMPONENT-Tabelle. Die PRODUCT-Tabelle enthält eine Liste aller Standardprodukte.

SpalteArtEinschränkungen
ModellCHAR (6)PRIMÄRSCHLÜSSEL
ProdNameCHAR (35)
ProdDescCHAR (31)
ListenpreisNUMERIC (9,2)

Die COMPONENT Tabelle enthält Komponenten, die in Ihre Produkte gehen.

SpalteArtEinschränkungen
CompIDCHAR (6)PRIMÄRSCHLÜSSEL
COMPTYPECHAR (10)
CompDescCHAR (31)

Die COMP_USED Tabelle Spuren, die Komponenten in jedes Produkt gehen.

SpalteArtEinschränkungen
ModellCHAR (6)UNBEKANNTER SCHLÜSSEL (Für PRODUCT)
CompIDCHAR (6)UNBEKANNTER SCHLÜSSEL (Für COMPONENT)

Eine Komponente kann in mehreren Produkten verwendet werden, und ein Produkt mehrere Komponenten (a many-to-many-Beziehung) enthalten kann. Diese Situation kann Integritätsprobleme verursachen. Um die Probleme zu umgehen, erstellen Sie die Verknüpfung Tabelle COMP_USED auf COMPONENT zu PRODUKT beziehen. Eine Komponente kann in vielen Reihen in der COMP_USED Tabelle erscheinen, aber jede dieser Zeilen wird nur eine Komponente (eine Eins-zu-viele-Beziehung) verweisen.

In ähnlicher Weise kann ein Produkt in vielen Zeilen in COMP_USED erscheinen, aber jede Zeile Referenzen nur ein Produkt (eine weitere Eins-zu-viele-Beziehung). Hinzufügen der Verknüpfungstabelle wandelt eine beschwerliche viele-zu-viele-Beziehung in zwei relativ einfache Eins-zu-Viele-Beziehungen. Dieser Prozess der Komplexität der Beziehungen zu reduzieren, ist ein Beispiel für die Normalisierung.

Unterabfragen durch das Schlüsselwort eingeführt IN

Eine Form einer verschachtelten Abfrage vergleicht einen einzelnen Wert mit dem Satz von Werten durch eine zurück WÄHLEN Erklärung. Es nutzt die IM Prädikat mit der folgenden Syntax:

WÄHLEN column_listVON TabelleWHERE Ausdruck IN (subquery) -

Der Ausdruck in der WOHER Klausel wertet auf einen Wert. Wenn dieser Wert IM die Liste von der Unterabfrage zurückgegeben, dann ist die WOHER Klausel gibt einen wahren Wert. Die angegebenen Spalten aus der Tabellenzeile verarbeitet werden, werden in die Ergebnistabelle hinzugefügt. Die Unterabfrage kann die gleiche Tabelle durch die äußere Abfrage verwiesen verweisen, oder es kann eine andere Tabelle verweisen.

Im folgenden Beispiel wird der Zetec Datenbank verwendet diese Art der Abfrage zu demonstrieren. Nehmen wir an, es gibt einen Mangel an Computer-Monitore in der Computerindustrie, so dass, wenn Sie aus Monitoren ausführen, können Sie nicht mehr Produkte zu liefern, die sie enthalten. Sie wollen wissen, welche Produkte betroffen sind. Er blickte dankbar auf Ihrem eigenen Monitor, geben Sie die folgende Abfrage:

SELECT ModelFROM COMP_USEDWHERE CompID IN (SELECT CompIDFROM COMPONENTWHERE COMPTYPE = 'Monitor') -

SQL verarbeitet die innerste Abfrage zuerst, so verarbeitet sie die COMPONENT-Tabelle, die Rückgabe des Werts von CompID für jede Zeile, in der COMPTYPE ist 'Monitor'. Das Ergebnis ist eine Liste der ICH WÜRDE Nummern aller Monitore. Die äußere Abfrage vergleicht dann den Wert von CompID in jeder Zeile in der Tabelle COMP_USED gegen die Liste.

Wenn der Vergleich erfolgreich ist, wird der Wert des Modell Spalte für diese Zeile ist mit dem äußeren hinzugefügt WÄHLEN'S Ergebnistabelle. Das Ergebnis ist eine Liste aller Produktmodelle, die einen Monitor umfassen. Das folgende Beispiel zeigt, was passiert, wenn Sie die Abfrage ausführen:

Modell ----- CX3000CX3010CX3020MB3030MX3020MX3030

Sie wissen nun, welche Produkte wird bald ausverkauft sein. Es ist Zeit, um die Sales Force zu gehen und ihnen sagen, auf die Förderung dieser Produkte zu verlangsamen.

Wenn Sie diese Form der verschachtelten Abfrage verwenden, muss die Unterabfrage eine Spalte angeben, und dass Datentyp der Spalte muss mit dem Datentyp des Arguments entsprechen der vorhergehenden IM Stichwort.

Hoffentlich erinnern Sie sich das KISS-Prinzip. Dinge einfach zu halten wichtig ist, wenn Sie mit Software jeglicher Art zu tun hat, aber es ist besonders wichtig, wenn mit Datenbank-Software zu tun haben. Aussagen, die verschachtelt umfassen WÄHLENs kann schwierig sein, richtig zu machen.

Ein Weg, um ihnen zu arbeiten, wie sie sollten, ist die innere laufen WÄHLEN ganz von selbst zuerst und dann überprüfen, ob das Ergebnis, das Sie erhalten, ist das Ergebnis, das Sie erwarten. Wenn Sie sicher sind, dass die Innen WÄHLEN richtig funktioniert, können Sie es im äußeren Teil der Aussage umschließen und eine bessere Chance haben, dass das Ganze wie beschrieben funktionieren.

Unterabfragen durch das Schlüsselwort eingeführt NICHT IN

So wie Sie eine Unterabfrage mit der Einführung kann IM Stichwort, können Sie das Gegenteil tun und führen es mit der NICHT IN Schlüsselwörter. In der Tat ist jetzt eine gute Zeit für Zetec-Management, eine solche Abfrage zu machen. Zetec-Management fand heraus, welche Produkte nicht zu verkaufen. Das ist wertvolle Informationen, aber was Zetec Management will wirklich wissen, ist, welche Produkte nach verkaufen.

Das Management will den Verkauf von Produkten zu betonen, dass nicht enthalten Monitore. Eine verschachtelte Abfrage mit einer Unterabfrage durch die eingeführte NICHT IN Stichworte liefert die gewünschten Informationen:

SELECT ModelFROM COMP_USEDWHERE CompID NOT IN (SELECT CompIDFROM COMPONENTWHERE COMPTYPE = 'Monitor')) -

Diese Abfrage liefert das folgende Ergebnis:

Modell ----- PX3040PB3050PX3040PB3050

Im Beispiel erstellen die Anzahl der Zeilen nicht ein Problem, weil die Ergebnistabelle kurz ist. In der realen Welt, wie eine Ergebnistabelle Hunderte oder Tausende von Zeilen aufweisen. Um Verwechslungen zu vermeiden, ist es am besten Duplikate zu beseitigen. Sie können so leicht tun, die durch Zugabe von DISTINCT Stichwort auf die Abfrage. Nur Zeilen, die von allen zuvor abgerufenen Zeilen verschieden sind, werden in die Ergebnistabelle hinzugefügt:

SELECT DISTINCT ModelFROM COMP_USEDWHERE CompID NOT IN (SELECT CompIDFROM COMPONENTWHERE COMPTYPE = 'Monitor')) -

Wie erwartet, ist das Ergebnis wie folgt:

Modell ----- PX3040PB3050

Menü