我有一个简单的表,它有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;

在您的数据库中,它们可能同样高效,但是测试它们中的每一个仍然是一个好主意,至少要避免出现性能比其他任何一个都差的结果。

09-20 15:30