指导创建SQL查询

时间:2015-04-03 19:53:25

标签: sql

我正在尝试创建一个返回尚未收到商品的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

3 个答案:

答案 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 BYWHERE Orders.OrderID IS NULL,则会得到类似于您要查找的内容。在那里运行SQL并尝试使用他们的数据不同的东西,它将帮助您了解不同类型的连接如何工作