我正在尝试创建一个返回尚未收到商品的userIds的查询。例如,我想向我的用户提供productId 1019
,但我不想将产品提供给已经收到它的用户。但是下面的查询会一直返回userId = 1054
并且它应该只返回userId=3333
。我将不胜感激任何帮助。
用户:
Id Status
-----------------
1054 Active
2222 Active
3333 Active
优惠:
userId ProductId
--------------------
1054 1019
1054 1026
2222 1019
3333 1026
查询
DECLARE @i int = 1019
SELECT Distinct c.id
FROM Users c
INNER JOIN offers o ON c.id = o.UserId
WHERE o.ProductId NOT IN (@i)
ORDER BY c.id
答案 0 :(得分:3)
这是一个SQLFiddle来展示它是如何工作的:http://sqlfiddle.com/#!6/cb79b/3
select
c.id
from
Users c
where
c.id not in (
select
o.userid
from
Offers o
where o.ProductId = @i
)
order by c.id
答案 1 :(得分:3)
您可以使用LEFT JOIN:
DECLARE @i int = 1019
SELECT c.id
FROM
Users c LEFT JOIN offers o
ON c.id = o.UserId
AND o.ProductId IN (@i)
WHERE
o.UserId IS NULL
ORDER BY
c.id
请参阅示例here。
答案 2 :(得分:0)
我认为缺少的是你应该使用左连接而不是内连接
点击此处查看示例:http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join_left
如果您替换了链接中的示例ORDER BY
和WHERE Orders.OrderID IS NULL
,则会得到类似于您要查找的内容。在那里运行SQL并尝试使用他们的数据不同的东西,它将帮助您了解不同类型的连接如何工作