过滤第二个左连接 - SQL

时间:2016-03-30 19:01:30

标签: mysql sql

我有三张桌子。一个是客户,一个是他们购买的产品,另一个是他们已经完成的回报:

表客户

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

表产品

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

表返回

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

我想得到所有购买烤面包机的顾客,除非他们还买了一个面包箱,但是如果他们已经多次退回产品,那就不行了。

所以我尝试了以下内容:

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'
)

这给了我买过烤面包机而不是面包箱的那些。因此,丽莎和弗雷德。

但是我怀疑Lisa是故意破坏产品的,所以我不想包括那些不止一次退回产品的产品。因此,我在声明中添加什么才能获得Freds信息?

3 个答案:

答案 0 :(得分:1)

怎么样

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

答案 1 :(得分:0)

除了第一个表格之外的所有ON,所有过滤条件都放在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');

第一个表的条件保留在WHERE子句中。

作为注释:包含Product的名为CustId的表格似乎很尴尬。该表的行为更像是名称CustomerProducts

答案 2 :(得分:0)

您使用条件$ source ~/.bashrc

COUNT