簡體   English   中英

SQL - 查找購買所有產品的客戶

[英]SQL - Find customers who bought all products

假設我有 2 個表:

表A

C_ID   P_ID
   1      1
   1      2
   2      1

表B

P_ID
   1
   2

表A中C_IDP_ID作為PK,表B中P_ID為PK

我想找到所有購買 B 中所有產品的 C_ID(基本上是 B 中的所有 P_ID)。 在上面的示例中, C_ID = 1

你能檢查一下下面是否正確嗎? 任何更有效/更容易的替代方案?

SELECT A.C_ID
FROM A
JOIN B ON A.P_iD = B.P_ID
GROUP BY A.C_ID
HAVING COUNT(DISTINCT A.P_ID) >= (SELECT COUNT(DISTINCT P_ID) FROM B)

謝謝!

以下查詢適用於 MySQL 和 SQL 服務器。

你可以在沒有JOIN的情況下做到這一點

select 
    c_id
from tableA 
group by 
    c_id
having count(distinct p_id) = (select count(*) from tableB)

另一個答案不正確,因為它只驗證客戶購買了與產品表中的項目一樣多的不同項目。 但是,如果您的表看起來像這樣:

C_ID   P_ID
   1      1
   1      3
   2      1

查詢將返回客戶 1,即使客戶 1 沒有購買所有產品(即,他們沒有購買產品P_ID=2

廣義解

您要查找的內容稱為分部查詢。 該策略基於雙重否定,認為:

“給我所有沒有產品、從未購買過的客戶”

在 SQL 中:

-- define a customer table
WITH customers as (
     SELECT DISTINCT C_ID
     FROM A)

-- all customers who have not
SELECT * 
FROM customers as outer
WHERE NOT EXISTS
(   -- all products which have not
    SELECT * 
    FROM B as inner
    WHERE NOT EXISTS
    (   -- ever been purchased
        SELECT* 
        FROM A as matchtable
        WHERE matchtable.C_ID=outer.C_ID
        AND matchtable.P_ID=inner.P_ID)
 )
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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