2016-11-30 3 views
0

Wenn ich diese Abfrage, geben SieWarum gibt SQL zu viele Ergebnisse zurück?

SELECT OrderDetails.OrderDetailID, Customers.CustomerName 
    FROM OrderDetails, Customers 
     NATURAL JOIN Products 
     NATURAL JOIN Customers 
WHERE SupplierID = 5; 

1001 Datensätze zurückgegeben.

Wenn ich geben Sie diese Abfrage,

SELECT OrderDetailID 
    FROM OrderDetails 
     NATURAL JOIN Products 
WHERE SupplierID = 5; 

11 Datensätze

zurück

Wie zu erwarten gibt es 91 Datensätze in der Customers-Tabelle und 11 Ergebnisse sind in der zweiten Abfrage zurückgegeben und 91 * 11 = 1001. Ich weiß jedoch nicht, wie ich das beheben soll, und um zu verhindern, dass bei der ersten Abfrage doppelte Ergebnisse zurückgegeben werden.

Duplicate Returns

Schema des angehängt: http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

+2

ich wegbleiben würde aus natürlichen beitritt, sie sparen Sie eine kleine Menge für keinen wirklichen Nutzen der Eingabe und ein Unvorhersehbarkeit auf lange Sicht (z. B. später, nachdem das Projekt gewachsen ist, werden "standardisierte" Zeitstempel zu Tabellen hinzugefügt; jetzt gibt Ihr zuvor funktionierender NATURAL JOIN nur Ergebnisse mit identischen Zeitstempeln zurück). – Uueerdo

+2

^^ Ja, bitte posten Sie die Tabellenstrukturen, damit wir eine genaue Antwort liefern können, ohne zu raten. Das Problem liegt jedoch an der Verwendung von 'FROM OrderDetails, Customers', wo Sie aufgrund der Kommasyntax ein kartesisches Produkt mit einem impliziten inneren Join erstellt haben. –

+0

Der Link, den Sie enthalten, zeigt das Schema nicht tatsächlich an. Bitte bearbeiten Sie die Frage, um die Anweisungen zum CREATE TABLE direkt hier hinzuzufügen. –

Antwort

0

Sie werden die Orders Tabelle verwenden müssen in Customers von der OrderDetails seit OrderDetails beitreten nicht die customerid enthalten, die erforderlich ist, damit Sie das bekommen customers Tabelle.

wäre eine bessere Abfrage sein:

SELECT orderDetails.OrderDetailID, customers.CustomerName 
    FROM OrderDetails orderDetails 
     INNER JOIN Orders orders on orderDetails.OrderID = orders.OrderID 
     INNER JOIN Customers customers on orders.customerID = customers.customerID 
     INNER JOIN Products products on prderDetails.ProductID = products.ProductID 
    WHERE products.SupplierID = 5; 

wir Natural Joins vermeiden Hier da diese unberechenbar und wenn es SQL schreiben kann immer eine gute Idee, so explizit wie möglich zu sein. Außerdem verwenden wir die Tabelle Orders, um die Verknüpfung zu customers zu erhalten.

+0

"Natürliche Joins ... kann unvorhersehbar sein" - wenn Sie besorgt sind über eine Situation, in der sie "unberechenbar" sein können, dann können Sie defensiv codieren (was sowieso gute Praxis ist, richtig ?) z.B Verwenden Sie Ansichten mit Berechtigungen. – onedaywhen

0

Ersetzen Sie das Komma (das ist eine Abkürzung für CROSS JOIN) mit einem anderen NATURAL JOIN. Auch wenn NATURAL JOIN mit brauchen Sie keine Bereichsvariablen zu verwenden, dh OrderDetails.OrderDetailID einfach OrderDetailID ändern:

SELECT OrderDetailID, CustomerName 
    FROM OrderDetails 
     NATURAL JOIN Orders 
     NATURAL JOIN Customers 
     NATURAL JOIN Products 
WHERE SupplierID = 5; 
+0

Sie brauchen die Verknüpfung zu Produkten möglicherweise nicht. – onedaywhen

Verwandte Themen