2012-02-29 52 views
2

我認爲這將是一個簡單的查詢寫法,但實現起來比我第一次想到的要困難得多。如何從連接表中的列中排除其他值SQL

任何幫助,將不勝感激 - 它的駕駛我逼瘋了:)

我有兩個表,一個用戶第二;採購產品。用戶可以在產品表中有多個產品。

我有一個加入的查詢,我返回一個具有特定產品的用戶列表 - 迄今爲止這麼好。

現在,這裏的問題:

我想排除有其他特定產品的用戶。

因此,只返回具有產品1001的用戶,而不是在產品表中具有產品1001和1002的用戶。

回答

0

稍微不同的方法:

SELECT u.user_id 
FROM users u 
JOIN purchased_products p 
    ON u.user_id = p.user_id AND 
    p.product_id in (1001, 1002) 
GROUP BY u.user_id 
HAVING COUNT(DISTINCT p.product_id) = 1 AND 
     MIN(p.product_id) = 1001 
+0

該解決方案也按預期工作,並且在SQL服務器中表現良好。如果性能是重中之重,我會說這是正確的解決方案。非常感謝馬克。 – Carl 2012-02-29 17:06:26

2
SELECT u.* 
    FROM users u 
     INNER JOIN purchased_products p 
      ON u.user_id = p.user_id 
       AND p.product_id = 1001 
    WHERE NOT EXISTS(SELECT 1 
         FROM purchased_products p2 
         WHERE p2.product_id = 1002 
          AND p2.user_id = u.user_id) 
+0

這適用於預期的結果,但速度很慢。我查詢的表格非常龐大,用戶表格超過了800K行,而產品表格大約是。 300K。然而,在這種情況下,性能並不重要,因爲我只需要運行偶爾的報告。非常感謝您的貢獻。 – Carl 2012-02-29 17:01:38

0
SELECT * from `user` 
    LEFT JOIN `product` on `user`.`id` = `product`.`user_id` 
    WHERE `product`.`id` = <w1st_product_id> 
     AND `user`.`id` NOT IN ( 
      SELECT user_id 
      FROM product 
      WHERE product.id = <2nd_product_id> 
     ) 
+0

反引號是特定於MySQL的 - 操作系統正在使用SQLServer。 – 2012-02-29 14:45:43

+0

此解決方案也適用於SQL服務器 - 一旦反引號刪除:)謝謝! – Carl 2012-02-29 17:49:06

0
SELECT * from user U 
where (select count(*) from product P where P.user_id=U.user_id)=1 
+0

我需要指定產品ID,但謝謝。 – Carl 2012-02-29 17:04:05

0

只返回有產品1001有兩種產品在產品表1001和1002,而不是用戶的用戶。

如果您使用SQL Server 2005或更高版本,可以使用

SELECT U.Id 
FROM [User] U INNER JOIN Product P ON U.Id = P.UserId AND P.ProductId = 1001 
EXCEPT 
SELECT U.Id 
FROM [User] U INNER JOIN Product P ON U.Id = P.UserId AND P.ProductId = 1002 

,正如單詞「EXCEPT」建議,將返回IDS對具有產品1002,除非用戶他們也有產品1002.

+0

在這個例子中,我們使用的是2000.但是你的回答對知道非常有用,謝謝。 – Carl 2012-02-29 15:39:52