簡體   English   中英

如何找到購買一種產品而不是另一種產品的人?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM