2017-04-20 4 views
0

Diese Abfrage zeigt nicht korrekt Ergebnis. Es zeigt alle CustomerId.SQL: mehrere innere Verknüpfung in Unterabfrage

select Customers.customerid, Customers.custfirstname, Customers.custlastname from customers 
where exists (select * from customers c 
inner join orders o on c.CUSTOMERID=o.CUSTOMERID 
inner join ORDER_DETAILS od on o.ordernumber = od.ORDERNUMBER 
inner join products on products.PRODUCTNUMBER= od.PRODUCTNUMBER 
where products.CATEGORYID= 2 and o.customerid = o.customerid); 

das obige Ergebnis ist

CUSTOMERID CUSTFIRSTNAME    CUSTLASTNAME    
---------- ------------------------- ------------------------- 
     1001 Suzanne     Viescas     
     1002 William     Thompson     
     1003 Gary      Hallmark     
     1004 Robert     Brown      
     1005 Dean      McCrae     
     1006 John      Viescas     
     1007 Mariya     Sergienko     
     1008 Neil      Patterson     
     1009 Andrew     Cencini     
     1010 Angel      Kennedy     
     1011 Alaina     Hallmark     
     1012 Liz      Keyser     
     1013 Rachel     Patterson     
     1014 Sam      Abolrous     
     1015 Darren     Gehring     
     1016 Jim      Wilson     
     1017 Manuela     Seidel     
     1018 David      Smith      
     1019 Zachary     Ehrlich     
     1020 Joyce      Bonnicksen    
     1021 Estella     Pundt      
     1022 Caleb      Viescas     
     1023 Julia      Schnebly     
     1024 Mark      Rosales     
     1025 Maria      Patterson     
     1026 Kirk      DeGrasse     
     1027 Luke      Patterson     
     1028 Jeffrey     Tirekicker    

28 rows selected 

I gleiche Bedeutung der obigen Abfrage gemacht, diese Abfrage korrektes Ergebnis zeigt. Es zeigt das Ergebnis, dass der Kunde, der nur products.CATEGORYID gekauft = 2

select distinct c.customerid, c.custfirstname, c.custlastname from customers c 
inner join orders o on o.customerid=c.CUSTOMERID 
inner join ORDER_DETAILS od on od.ORDERNUMBER=o.ORDERNUMBER 
inner join products p on p.PRODUCTNUMBER=od.productnumber 
where p.CATEGORYID= 2 
order by 1; 

das richtige Ergebnis ist

CUSTOMERID CUSTFIRSTNAME    CUSTLASTNAME    
    ---------- ------------------------- ------------------------- 
      1002 William     Thompson     
      1004 Robert     Brown      
      1005 Dean      McCrae     
      1006 John      Viescas     
      1007 Mariya     Sergienko     
      1008 Neil      Patterson     
      1009 Andrew     Cencini     
      1010 Angel      Kennedy     
      1011 Alaina     Hallmark     
      1012 Liz      Keyser     
      1013 Rachel     Patterson     
      1014 Sam      Abolrous     
      1016 Jim      Wilson     
      1017 Manuela     Seidel     
      1018 David      Smith      
      1019 Zachary     Ehrlich     
      1020 Joyce      Bonnicksen    
      1021 Estella     Pundt      
      1023 Julia      Schnebly     
      1024 Mark      Rosales     
      1025 Maria      Patterson     
      1026 Kirk      DeGrasse     
      1027 Luke      Patterson     

    23 rows selected 

was ist das Problem in der ersten Abfrage?

+0

'EXISTS' wenn es überprüft, sind irgendwelche Ergebnisse in Ihrer Unterabfrage. Ihre Unterabfrage gibt Datensätze zurück, da mindestens ein Kunde in dieser CategoryID gekauft hat, sodass alle Datensätze den Test in der äußeren Abfrage bestehen. Es sieht so aus, als ob du versucht hast, eine korrelierte Unterabfrage mit der 'o.customerid = o.customerid' zu machen, aber das ist Unsinn. 'o.customerid = o.customerid' ist IMMER wahr. Stattdessen vielleicht: 'customer.customerid = o.customerid', so dass Sie die äußere Abfrage-Kundentabelle mit der 'o'-Tabelle der inneren Abfrage vergleichen. – JNevill

+0

innere Join-Aufträge o auf c.CUSTOMERID = o.CUSTOMERID-Teil umfasst customer.customerid = o.customerid-Teil. Das Ergebnis ist also das gleiche. Wenn ich den Teil "und o.customerid = o.customerid" loswerde, ist das Ergebnis dasselbe. Trotzdem danke! – vincnet

Antwort

0

Wie JNevill darauf hingewiesen hat, gibt EXISTS true zurück, wenn in der Unterabfrage ein Ergebnis vorliegt. Wenn Sie dies ändern:

SELECT c.customerid, c.custfirstname, c.custlastname 
FROM customers AS c 
WHERE c.customerid IN (SELECT [subquery here...] 
         WHERE products.CATEGORYID = 2) 

Ihre Unterabfrage nicht o.customerid = o.customerid benötigt, da dies wie ein Tippfehler sieht statt o.customerid = c.customerid und dies wird in Ihrem INNER JOIN Zustand bedeckt.

**** bearbeiten [Exists version] ****

SELECT c1.customerid, 
     c1.custfirstname, 
     c1.custlastname 
FROM customers AS c1 
WHERE EXISTS (SELECT 1 
       FROM customers c2 
       INNER JOIN orders o ON c2.CUSTOMERID = o.CUSTOMERID 
       INNER JOIN ORDER_DETAILS od ON o.ordernumber = od.ORDERNUMBER 
       INNER JOIN products ON products.PRODUCTNUMBER = od.PRODUCTNUMBER 
       WHERE products.CATEGORYID = 2 AND c2.customerid = c.customerid) 

Der beste Weg wäre einfach Ihre subquery sein auf seine eigene:

SELECT c.customerid, 
     c.custfirstname, 
     c.custlastname 
FROM customers AS c 
INNER JOIN orders o ON c.CUSTOMERID = o.CUSTOMERID 
INNER JOIN ORDER_DETAILS od ON o.ordernumber = od.ORDERNUMBER 
INNER JOIN products ON products.PRODUCTNUMBER = od.PRODUCTNUMBER 
WHERE products.CATEGORYID = 2 
+0

Danke! Es klappt. Aber gibt es eine Möglichkeit, dass ich EXISTS anstelle von WHERE IN benutzen kann? – vincnet

+0

Ich habe zwei weitere Lösungen zu meiner ersten Antwort hinzugefügt, einschließlich der EXISTS. Ich würde es jedoch nicht empfehlen, weil der einfachste Weg, dies zu tun, ohne die Unterabfrage ist :) – Alex

+0

Danke für Ihre Hilfe. Das war meine erste Frage. Ich schätze Ihre Hilfe. – vincnet