2016-05-31 9 views
-1

Ich bin sehr neu in SQL und ich habe gerade begonnen, meine eigene Datenbank in SQL Management Studio 2014 zu Hause zu erstellen. Also lerne ich immer noch die Grundlagen. Die Datenbank heißt FitnessClub (eine erfundene Firma, die ich erfunden habe).Benötigen Sie Anleitung zum Erstellen einer SQL-Abfrage

In dieser Datenbank habe ich drei Tabellen: Schüler, Sport und SchülerSports (ich glaube, Sie nennen es eine Junction-Tabelle?) Bitte gehen Sie davon aus, dass die PK und FK in allen Tabellen richtig sortiert.

Ich habe beschlossen, 20 Schüler und 10 Sport hinzuzufügen. Ich habe die ersten 10 Schüler mit den 10 Sportarten hintereinander eingeteilt, was bedeutet, dass die restlichen 10 Schüler keinen Sport bekommen haben.

In meiner PupilsSports Tabelle habe ich PupilID (PK) und SportID (PK) beide auf die jeweilige Spalte in den anderen beiden Tabellen bezogen und hier habe ich die 10 Schüler mit den 10 Sportarten auf einfache Weise hinzugefügt dies:

+-----+-------+ 
    | P.ID | S.ID | 
    +-----+-------+ 
    | 1 | 1  | 
    | 2 | 2  | 
    | 3 | 3  | 
    | 4 | 4  | 
    | 5 | 5  | 
    | 6 | 6  | 
    | 7 | 7  | 
    | 8 | 8  | 
    | 9 | 9  | 
    | 10 | 10 | 
    +-----+-------+ 

ich möchte eine SQL-Abfrage erstellen, die ich laufen kann die Liste der Schüler, um herauszufinden, der nicht zu einem Sport zugeteilt? Ist das möglich?

Danke

+1

Ja ist es leicht möglich. Wenn Sie nur SQL lernen, sollten Sie die folgenden Tutorials, die im Internet frei verfügbar sind, und vielleicht ein oder zwei Bücher verbessern, anstatt eine Frage in einem Forum für jede neue Technik zu stellen, die Sie lernen möchten. Diese Frage ist sehr einfach. –

Antwort

1

Eine äußere Verknüpfung und einen Filter auf Nullwerte sollten den Trick. Etwas wie folgt aus:

SELECT 
    * 
FROM 
    Pupils 
    LEFT OUTER JOIN PupilsSports 
    ON Pupils.ID = PupilsSports.PupilID 
WHERE 
    PupilsSports.SportID IS NULL 

Im Grunde eine äußere anschließen würden Sie die komplette Obermenge geben der beiden Tabellen verknüpft, so dass Werte wie NULL wo kein passender Datensatz gefunden wurde. Wenn die NULL-Werte in der WHERE-Klausel gefiltert werden, sollte die Ergebnismenge so reduziert werden, dass nur die Datensätze einbezogen werden, für die kein übereinstimmender verbundener Datensatz gefunden wurde.

Oder vielleicht eine Unterabfrage Ansatz statt:

SELECT 
    * 
FROM 
    Pupils 
WHERE 
    ID NOT IN (SELECT PupilID FROM PupilsSports) 

eine Reihe von verschiedenen Möglichkeiten Es gibt die Aufgabe zu erfüllen, stelle ich mir vor. Eine interessante Lernerfahrung besteht darin, den Abfrageausführungsplan in SQL Management Studio für jeden Ansatz zu untersuchen und festzustellen, wie diese sich unterscheiden und wo mögliche Engpässe liegen.

+0

Danke, David.So grundlegend wie mein Problem klingt, ich hatte keine Ahnung von der Verwendung der Unterabfrage! –

0

viele Möglichkeiten, die Katze Haut ... hier ist eine, die zu verstehen, relativ einfach ist:

SELECT * FROM Pupils WHERE PupilID NOT IN (SELECT PupilID FROM PupilsSports) 
0

In einem Versuch, nicht einfach diese Abfrage für Sie zu schreiben, werde ich versuchen, Sie auf das zeigen, was Sie brauchen. Zuerst müssen Sie diese beiden Tabellen zusammen JOIN. A LEFT JOIN nimmt alle Zeilen aus der linken Tabelle und nur übereinstimmende Zeilen aus der rechten Tabelle.

Sobald Sie eine Liste aller Schüler mit ihren entsprechenden Sportarten haben (oder NULL, wo es keine Sportart gibt), können Sie mit der WHERE Aussage filtern. Denken Sie daran, dass Sie, um die Werte NULL anzugeben, etwas wie WHERE Sports IS NULL anstelle des Gleichheitsoperators = verwenden müssen.

Verwandte Themen