2012-02-13 21 views
0

我有一個表稱爲事務用SQL查詢

Transaction: 
    User_Id: int 
    Transaction_Type: int 
    Amount: int 

我多麼查詢沒有交易類型1.

SELECT * FROM Transaction WHERE Transaction_Type <> 1 Group By User_Id 

所有用戶彷彿回到所有用戶掙扎&他們的交易類型不= = 1.我需要所有缺少/沒有1類記錄的用戶。

回答

4

這可以通過IN()子查詢

SELECT DISTINCT User_Id FROM Transaction 
WHERE User_Id NOT IN (SELECT DISTINCT User_Id FROM Transaction WHERE Transaction_Type = 1) 

或者用NOT EXISTS

SELECT 
    DISTINCT User_Id 
FROM Transaction t 
WHERE 
    NOT EXISTS (SELECT User_Id FROM Transaction tn WHERE Transaction_Type = 1) 
    AND t.User_Id = tn.User_Id 
+0

+1加速8秒。 – 2012-02-13 19:41:00

+0

@AnthonyGrist和+1爲你只是想念它。 – 2012-02-13 19:42:31

1

有可能這樣做的更優雅的方式,但這應該工作:

SELECT * FROM Transaction WHERE User_Id NOT IN (SELECT User_Id FROM Transaction WHERE Transaction_Type = 1) 
0
SELECT DISTINCT User_Id 
FROM Transaction 
WHERE Transaction_Id <> 1 
GROUP BY User_Id 

這得到它在每個User_Id至少有一個不屬於類型1的交易。如果您還想要沒有交易的交易,請添加OR Transaction_Id IS NULLWHERE聲明。

1
SELECT * 
FROM (SELECT DISTINCT User_Id FROM Transaction) AS User 
LEFT JOIN Transaction ON Transaction.User_Id   = User.id 
        AND Transaction.Transaction_Id != 1 
WHERE Transaction.Transaction_Id IS NULL 
GROUP BY User.id 
0

例如

SELECT DISTINCT User_Id 
FROM [Transaction] 
EXCEPT 
SELECT User_Id 
FROM [Transaction] 
WHERE Transaction_Id = 1 

那如果你沒有爲用戶提供單獨的表的。如果你這樣做,那麼使用外連接。

我不會使用關鍵字(如Transaction)爲表/列名

0

我會用JOIN做到這一點建議。假設Users表:

SELECT u.* 
FROM Users u 
LEFT JOIN Transaction t 
ON t.User_ID = u.User_ID 
AND t.Transaction_Type = 1 
WHERE t.User_ID IS NULL 

這種方法避免了子查詢和DISTINCT