如何从连接表SQL中的列中排除另一个值

时间:2012-02-29 14:28:38

标签: sql sql-server tsql

我认为这是一个直截了当的编写查询,但事实证明它比我最初想的要复杂得多。

任何帮助都会非常感激 - 它正在推动我的发展:)

我有两张桌子,一张是第二张用户;采购产品。用户可以在PRODUCTS表中拥有多个产品。

我有一个加入的查询,我返回一个具有特定产品的用户列表 - 到目前为止一直很好。

现在问题在于:

我想排除拥有其他特定产品的用户。

因此,仅返回具有产品1001的用户,而不是在PRODUCTS表中同时具有产品1001和1002的用户。

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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> 
        )

答案 2 :(得分:0)

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

答案 3 :(得分: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

答案 4 :(得分:0)

  

仅返回具有产品1001的用户,而不返回在PRODUCTS表中同时具有产品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”所暗示的那样,将为具有产品1002的用户返回ID,除非他们还有产品1002。