2015-04-03 60 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