如何从连接表中的列中排除其他值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
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)
这适用于预期的结果,但速度很慢。我查询的表格非常庞大,用户表格超过了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>
)
反引号是特定于MySQL的 - 操作系统正在使用SQLServer。 – 2012-02-29 14:45:43
此解决方案也适用于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
我需要指定产品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.
在这个例子中,我们使用的是2000.但是你的回答对知道非常有用,谢谢。 – Carl 2012-02-29 15:39:52
该解决方案也按预期工作,并且在SQL服务器中表现良好。如果性能是重中之重,我会说这是正确的解决方案。非常感谢马克。 – Carl 2012-02-29 17:06:26