我有三张桌子。一个是客户,一个是他们购买的产品,另一个是他们已经完成的回报:
表客户
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信息?
答案 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