2016-03-29 77 views
0

我有兩個表。一個由客戶和另一個由產品,他們已經購買:選擇所有客戶,除非他們有其他產品 - SQL

表客戶

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

表產品

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

我想獲得所有買了一個烤麪包機的客戶,除非他們還買了一個麪包箱。

所以我曾嘗試以下:

SELECT * FROM Customer 
JOIN Product 
    ON Customer.CustID=Product.CustID 
WHERE Product in 
    (SELECT 
     Item 
    FROM Product 
    WHERE (Item = 'Toaster' AND Item != 'Breadbox')); 

和:

SELECT * FROM Customer 
INNER Join Product 
ON Customer.CustID=PRODUCT.CustID 
WHERE Product.Item = 'Toaster' 
AND Product.Item NOT IN ('Breadbox'); 

但都給出了相同的結果,其中包括湯姆,這不已經擁有一個麪包盒。

我該如何確保只有擁有烤麪包機但不擁有面包箱的客戶才能上市?

回答

1
SELECT distinct * 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' 
) 
+0

如果可能的話,此查詢將返回沒有產品的客戶,因此在我看來您想要內連接。如果可能有多個烤麪包機,這也會多次列出客戶。 – shawnt00

+0

我試過查詢,它的工作正確,你能舉個例子嗎? @ shawnt00 – wajeeh

+0

我的不好。我誤解了「where」作爲連接條件的一部分。但是,你真的不如寫'內部連接',因爲這就是你會得到的。 – shawnt00

1

試試這個:

SELECT c.CustID, c.Name 
FROM customer AS c 
JOIN product AS p ON c.CustID = p.CustID 
GROUP BY c.CustID, c.Name 
HAVING SUM(p.Item = 'Toaster') >= 1 AND SUM(p.Item = 'Breadbox') = 0 
2
SELECT * FROM Customer C 
LEFT JOIN Product PT ON C.CustID = PT.CustID AND PT.Item = 'Toaster' 
LEFT JOIN Product PB ON C.CustID = PB.CustID AND PB.Item = 'Breadbox' 
WHERE PT.Item IS NOT NULL AND PB.Item IS NULL 
0
select c.CustID, min(c.Name) as Name 
from Customer c inner join Product p 
    on p.CustID = c.CustID 
where p.Item in ('Toaster', 'Breadbox') 
group by c.CustID 
having 
    max(p.Item) = 'Toaster' and min(p.Item) = 'Toaster' 

having 
     count(case when p.Item = 'Toaster' then 1 end) > 0 
    and count(case when p.Item = 'Breadbox' then 1 end) = 0 

爲你做不嚴格第二種情況需要where雖然它可能有助於在大型演出表。

2

這是我的第一篇文章,所以原諒任何失誤。客戶和產品表之間存在「多對一」關係。要制定要應用的邏輯限制,您需要彙總產品表格或加入產品表格兩次。實際上,您正試圖將多對一關係摺疊爲「一對一」關係。

以下是產品表連接兩次的示例。

SELECT DISTINCT 
a.Name 
FROM 
Customer a 
JOIN Product b ON a.CustID = b.CustID 
LEFT JOIN Product c on a.CustID = c.CustID AND c.Item = 'Breadbox' 
WHERE 
b.Item = 'Toaster' AND 
c.CustID IS NULL 

或(略微低效率取決於索引)

SELECT DISTINCT 
a.Name 
FROM 
Customer a 
JOIN Product b ON a.CustID = b.CustID 
WHERE 
b.Item = 'Toaster' AND 
NOT EXISTS (SELECT 1 FROM Product c where a.CustID = c.CustID AND c.Item = 'Breadbox') 

而且,這裏是產品表中加入一次的例子 - 可能複雜得多,你需要。

SELECT 
a.Name 
FROM 
Customer a 
JOIN 
(
    SELECT 
    CustID, 
    SUM(case when Item = 'Toaster' then 1 else 0 end) sum_Toaster, 
    SUM(case when Item = 'Breadbox' then 1 else 0 end) sum_Breadbox 
    FROM 
    Product 
    WHERE 
    Item in ('Toaster','Breadbox') 
    GROUP BY 
    CustID 
    HAVING 
    SUM(case when Item = 'Toaster' then 1 else 0 end) > 0 AND 
    SUM(case when Item = 'Breadbox' then 1 else 0 end) = 0 
) b ON a.CustID = b.CustID 
相關問題