2016-03-30 16 views
0

Ich habe drei Tabellen. Eine besteht aus Kunden, eine besteht aus Produkten, die sie gekauft haben, und die letzten die Rückkehr sie getan hat:Filter auf der zweiten linken Join - SQL

Tabelle Kunde

CustID, Name 
    1,  Tom 
    2,  Lisa 
    3,  Fred 

Tabelle Produkt

CustID, Item 
    1,  Toaster 
    1,  Breadbox 
    2,  Toaster 
    3,  Toaster 

Tabelle Kosten

CustID, Date, Reason 
    1,  2014, Guarantee 
    2,  2013, Guarantee 
    2,  2014, Guarantee 
    3,  2015, Guarantee 

Ich möchte alle Kunden erhalten, die einen Toaster gekauft haben, es sei denn sie Ich habe auch eine Brotbox gekauft, aber nicht, wenn sie ein Produkt mehr als einmal zurückgegeben haben.

Also habe ich versucht, die folgenden:

SELECT * FROM Customer 
LEFT JOIN Product ON Customer.CustID=Product.CustID 
LEFT JOIN Returns ON Customer.CustID=Returns.CustID 
WHERE Item = 'Toaster' 
AND Customer.CustID NOT IN (
Select CustID FROM Product Where Item = 'Breadbox' 
) 

Das bin ich diejenigen gibt, die einen Toaster aber keine breadbox gekauft haben. Daher Lisa und Fred.

Aber ich verdächtige Lisa, die Produkte absichtlich zu brechen, also möchte ich jene nicht einschließen, die ein Produkt mehr als einmal zurückgegeben haben. Also, was füge ich der Aussage hinzu, um nur Freds Informationen zu erhalten?

+0

Ich denke, man diese Frage gestern gefragt. Siehe hier -> http://stackoverflow.com/questions/36293041/select-all-customers-except-if-the-have-another-product-sql –

+0

@SatwikNadkarny Ist das gleiche, aber jetzt fügt er die Rückkehr Bedingung –

Antwort

1

Wie wäre es

SELECT * FROM Customer 
LEFT JOIN Product ON Customer.CustID=Product.CustID 
WHERE Item = 'Toaster' 
AND Customer.CustID NOT IN ( 
    Select CustID FROM Product Where Item = 'Breadbox' 
) 
AND (SELECT COUNT(*) FROM Returns WHERE Customer.CustId = Returns.CustID) <= 1 
0

Die Filterbedingung in der für alle ON Klausel geht aber die erste Tabelle (in einer Reihe von LEFT JOIN:

SELECT * 
FROM Customer c LEFT JOIN 
    Product p 
    ON c.CustID = p.CustID AND p.Item = 'Toaster' LEFT JOIN 
    Returns r 
    ON c.CustID = r.CustID 
WHERE c.CustID NOT IN (Select p.CustID FROM Product p Where p.Item = 'Breadbox'); 

Bedingungen auf der ersten Tabelle verbleiben im WHERE

Als Anmerkung: Eine Tabelle namens Product, die eine CustId enthält scheint aw kward. Die Tabelle verhält sich mehr wie ihr Name sollte CustomerProducts.

+1

Still brauche die Bedingung für "Retouren", wenn ein Kunde zu viele Produkte bricht. Die Tischprodukte sind mehr wie 'Verkäufe'. Btw Cograts auf Ihrer 400k Marke. –

0

Sie verwenden bedingte COUNT

SELECT C.CustID, C.Name 
FROM Customer C 
JOIN (SELECT CustID 
     FROM Products 
     GROUP BY CustID 
     HAVING COUNT(CASE WHEN Item = 'Toaster' THEN 1 END) > 1 
      AND COUNT(CASE WHEN item = 'Breadbox' THEN 1 END) = 0 
    ) P -- Get customer with at least one Toaster and not Breadbox 
    ON C.CustID = P.CustID 
JOIN (SELECT CustID 
     FROM Returns 
     HAVING COUNT(*) < 2 
    ) R -- Get only customers with less than 2 returns 
    ON C.CustID = R.CustID 
Verwandte Themen