如何从连接表中的列中排除其他值SQL

问题描述:

我认为这将是一个简单的查询写法,但实现起来比我第一次想到的要困难得多。如何从连接表中的列中排除其他值SQL

任何帮助,将不胜感激 - 它的驾驶我逼疯了:)

我有两个表,一个用户第二;采购产品。用户可以在产品表中有多个产品。

我有一个加入的查询,我返回一个具有特定产品的用户列表 - 迄今为止这么好。

现在,这里的问题:

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

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

稍微不同的方法:

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

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

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

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

只返回有产品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