2015-04-03 40 views
0

我想创建一个查询,返回没有收到offerIs的用户ID。例如,我想向我的用户提供productId 1019,但我不想将产品提供给已经收到它的用户。但下面的查询不断返回userId = 1054,它应该只返回userId=3333。我会感谢任何帮助。指导创建一个SQL查询

用户

Id  Status 
    ----------------- 
    1054  Active 
    2222  Active 
    3333  Active 

信息

userId ProductId 
-------------------- 
1054  1019 
1054  1026 
2222  1019 
3333  1026 

查询

​​3210
+0

只是为了澄清。你的预期结果只有'3333',但你实际上同时得到'3333 1054'? – ryanyuyu 2015-04-03 19:56:56

+0

ryanyuyu,谢谢你的回复,是的,我只应得到3333 – Carlos 2015-04-03 20:00:36

回答

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

0

我认为是缺乏的是你应该用剩下的东西加入一个内部的,而不是加入

去看看这里的例子:http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join_left

如果更换,在本例中的链接时,ORDER BYWHERE Orders.OrderID IS NULL你得到类似于你在找什么东西。运行SQL在那里,并尝试与他们的数据不同的东西它会帮助你大把大把的理解不同类型的工作

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 
+0

Upvoted,但如果表现是一个问题,应该比较左连接。根据我的经验,左连接速度更快。 – UnhandledExcepSean 2015-04-03 20:13:01

+0

伙计们,所有的反应都很有用!非常感谢!我希望我能标记所有的答复。我真的很感激它。祝您周末愉快! – Carlos 2015-04-03 20:14:54

+0

这是真的,但我喜欢在这种情况下使用NOT IN的可读性。 – Bob 2015-04-03 20:15:47