在SQL查询中苦苦挣扎

时间:2012-02-13 19:37:23

标签: mysql sql

我有一个名为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的记录。

6 个答案:

答案 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