我有一个简单的表,它有4个字段:
indexID
UserID
text_1
IsFinal
对于每个
UserID
,此表可能有多个值,IsFinal
字段只能有一个值1或0。我要做的是生成一个select语句,如果
IsFinal
只等于0,它将返回用户id。问题是同一个用户id可能有多个记录,有些记录的IsFinal
等于0,只有1个记录的IsFinal
等于1。我的问题是:对于每个
UserID
,如果它有一个带有Isfinal = 1
的记录,我想忽略所有具有相同UserID
的记录,否则我想返回它的记录。我不知道这是否只能通过SQL语句来实现。 最佳答案
似乎您想要一个反连接,即首先需要确定哪些用户id具有IsFinal = 1
,然后使用该结果集返回不在该列表中的所有用户id。
有多种方法可以实现反连接。NOT IN
:
SELECT *
FROM atable
WHERE UserID NOT IN (
SELECT UserID
FROM atable
WHERE IsFinal = 1
);
NOT EXISTS
:SELECT *
FROM atable t1
WHERE NOT EXISTS (
SELECT *
FROM atable t2
WHERE t1.UserID = t2.UserID
AND t2.IsFinal = 1
);
LEFT JOIN
+WHERE IS NULL
:(一)
SELECT *
FROM atable t1
LEFT JOIN (
SELECT *
FROM atable
WHERE IsFinal = 1
) t2 ON t1.UserID = t2.UserID
WHERE t2.UserID IS NULL;
(二)
SELECT *
FROM atable t1
LEFT JOIN atable t2
ON t1.UserID = t2.UserID AND t2.IsFinal = 1
WHERE t2.UserID IS NULL;
在您的数据库中,它们可能同样高效,但是测试它们中的每一个仍然是一个好主意,至少要避免出现性能比其他任何一个都差的结果。