2017-06-07 2 views
2

Ich mache Praxisabfragen, um meine SQL-Kenntnisse zu verbessern (ich bin ein Anfänger), und ich stieß auf dieses Problem, dass ich Hilfe bei der Verwendung der Northwind-Datenbank benötige. Die angeforderte Abfrage sollte:SQL-Vergleichsabfrage

Geben Sie den Namen der Mitarbeiter und der Stadt, wo sie leben für Mitarbeiter, die an Kunden in der gleichen Stadt verkauft haben.

Was ich dafür geschrieben war:

USE Northwind; 
    SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
    INNER JOIN Customers ON c.City = e.City 
    WHERE e.City = ANY(SELECT Customers.City FROM Customers); 

I 6 Mitarbeiter zurück bin, aber ich bin nicht sicher, dass sie richtig sind, und ich glaube, dass meine WHERE-Anweisung als auch die falsche ist.

Grundsätzlich meine Frage ist, verwende ich die richtigen Join-Anweisungen und wie gehe ich zum Filtern von Ergebnissen mit der WHERE-Anweisung? Ich bin mir nicht sicher, wie man einen bestimmten Datensatz mit anderen Datensätzen vergleicht. Ausgehend von einem Java-Hintergrund bin ich an For-Schleifen gewöhnt, die jedes einzelne "Objekt" (Datensatz) mit einem bestimmten Feld von einem anderen "Objekt" überprüfen können. In diesem Fall frage ich mich, wie ich das City-Attribut jedes Datensatzes aus der Employees-Tabelle mit dem City-Attribut der Datensätze in der Customers-Tabelle überprüfen kann. Jeder Rat wird geschätzt, danke!

+1

Ihre Joins sind nicht korrekt, da Sie der Tabelle "Kunden" zweimal beitreten. Ändern Sie "INNER JOIN Customers" auf "AND" und entfernen Sie die WHERE-Klausel und Sie sollten gut sein. – Welbog

Antwort

1

Ich glaube, Sie nur die Kundentabelle einmal und beide Anforderungen haben kommen müssen (auf der gleichen Reihenfolge und derselben Stadt wie der Mitarbeiter sein) als beitreten Requisiten, zB

SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID AND c.City = e.City 

Alternativ können Sie nur die Join Kunde auf der Bestell-ID und filtern Sie die Stadt Anforderung in der Where-Klausel. Performance-weise sollte es keinen Unterschied jedoch, wenn Sie irgendwann auf das Skript aussehen wollen wieder kann es Ihnen helfen,

SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
    WHERE e.City = C.City 

ich die wichtige Rolle denken, daran zu erinnern, Ihren Kopf um zu bekommen, ist, dass nach Sie haben der Tabelle beigetreten, es ist effektiv eine Tabelle mit Spalten aus beiden (oder mehr mit mehreren Joins). Die inneren Join-Bedingungen filtern Zeilen aus, die keine Übereinstimmung zwischen den beiden Tabellen aufweisen, und dann müssen Spalten verglichen werden.

+0

Ich wusste nicht, dass Sie eine AND-Anweisung für Joins verwenden können, also danke, dass Sie mir das beigebracht haben! Wie ich dies interpretiere ist, dass ich nicht denke, dass es logisch korrekt wäre, da die angeforderte Abfrage für einen Angestellten ist, der tatsächlich an einen bestimmten Kunden verkauft hat, den gleichen Stadtwert wie sie hat. Hat der INNER JOIN auf der EmployeeID dies abgedeckt? –

+0

ja das funktioniert für diesen Fall. Wenn Sie zwei Tabellen mit einem inneren Join verbinden, erstellen Sie effektiv eine neue größere Tabelle mit Spalten aus beiden Tabellen, die Ihre on-Klausel herausfiltert. Ich könnte einige Beispieltabellen und Ausgaben zur Antwort hinzufügen, wenn es Ihnen hilft, sich vorzustellen? – MarkD

+0

Ok ich verstehe. Ich verstehe Joins auf einer grundlegenden Ebene Ich war nur nicht sicher, ob in diesem Fall tatsächlich Ergebnisse für das, was ich in meiner Abfrage benötigt filtern würde. Danke für die Hilfe! –