我有一个名为transaction
的表Transaction:
User_Id: int
Transaction_Type: int
Amount: int
如何查询没有交易类型1的所有用户。
SELECT * FROM Transaction WHERE Transaction_Type <> 1 Group By User_Id
似乎返回所有用户和&amp;他们的交易类型不是= 1.我需要所有缺少的用户/没有类型1的记录。
答案 0 :(得分: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
答案 1 :(得分:1)
这可能是一种更优雅的方式,但这应该有效:
SELECT * FROM Transaction WHERE User_Id NOT IN (SELECT User_Id FROM Transaction WHERE Transaction_Type = 1)
答案 2 :(得分: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
答案 3 :(得分:0)
SELECT DISTINCT User_Id
FROM Transaction
WHERE Transaction_Id <> 1
GROUP BY User_Id
这会使每个User_Id
至少有一个不属于类型1的事务。如果您还想要没有事务的事务,请将OR Transaction_Id IS NULL
添加到WHERE
语句中。 / p>
答案 4 :(得分:0)
例如
SELECT DISTINCT User_Id
FROM [Transaction]
EXCEPT
SELECT User_Id
FROM [Transaction]
WHERE Transaction_Id = 1
如果您没有单独的用户表,那就是这样。如果这样做,那么使用外连接。
我建议不要使用关键字(如Transaction
)作为表/列名称
答案 5 :(得分: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
。