[英]How to find people who bought one product but NOT another?
我有一個表將客戶與以前的購買聯系起來:
RecID CustID ProdID
1 20 105
2 20 300
3 31 105
4 45 105
5 45 300
6 45 312
我想獲得一個購買第105項的CustID列表,但不是第300項。
在這種情況下, CustID 31。
我似乎無法用選擇和連接來做到這一點。 我很難過!
我肯定會感謝有經驗的SQL人員提供的一些幫助。
謝謝!
謝謝!
我是這個問題的原作者。
Mark Byers第二個使用NOT IN的例子很棒! (在這個為我工作之后,我沒有嘗試別人)。
他的第一個LEFT JOIN示例沒有返回任何CustID ...我認為我正確地復制了它並使用了正確的表名和列名。 所以我不知道為什么它對我不起作用。
再次感謝所有那些善於花時間為我寫出一些SQL的人。
我不得不創建一個新帳戶來發表評論(我無法使用我昨天創建的帳戶登錄,密碼恢復說它找不到我)
有三種常見的方法。 這是LEFT JOIN方法:
SELECT T1.CustID
FROM yourtable T1
LEFT JOIN yourtable T2 ON T1.CustID = T2.CustID AND T2.ProdId = 300
WHERE T1.ProdId = 105
AND T2.ProdId IS NULL
這里不是:
SELECT CustID
FROM yourtable
WHERE ProdId = 105
AND CustID NOT IN
(
SELECT CustID
FROM yourtable
WHERE ProdId = 300
)
或者您可以使用NOT EXISTS:
SELECT CustID
FROM yourtable T1
WHERE ProdId = 105
AND NOT EXISTS
(
SELECT NULL
FROM yourtable T2
WHERE T2.ProdId = 300
AND T2.CustID = T1.CustID
)
哪個具有更好的性能取決於您使用的數據庫和版本。
對於SQL Server,最好是使用NOT IN或NOT EXISTS:
在SQL Server中,NOT EXISTS和NOT IN謂詞是搜索缺失值的最佳方法,只要兩個列都是NOT NULL即可。 他們通過某種反加入來制定安全有效的計划。
LEFT JOIN / IS NULL效率較低,因為它不會嘗試跳過右表中已匹配的值,返回所有結果並將其過濾掉。
資源:
SELECT CustID from T T1
WHERE ProdID = 105
AND NOT EXISTS (SELECT 1 from T T2
WHERE T2.ProdID = 300
AND T2.CustID = T1.CustID)
幾種不同的方法。
select CustID from t where ProdID=105
except
select CustID from t where ProdID=300
要么
select CustID
from t
where ProdID in (105,300)
group by CustID
having max(ProdID)=105
SELECT PPT.CustID FROM PreviousPurchasesTable PPT
WHERE PPT.ProdID = 105
AND PPT.CustID NOT IN (SELECT PPT2.CustID FROM PreviousPurchasesTable PPT2 WHERE PPT2.ProdID = 300)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.