1

我有一个简单的表,它有 4 个字段:

indexID
UserID
text_1
IsFinal 

此表中的每个 可能有多个值UserID,并且IsFinal字段只能有一个值 1 或 0。

我正在尝试做的是创建一个选择语句,如果IsFinal仅等于 0,它将返回用户 ID。问题可能存在多个相同用户 ID 的记录,一些IsFinal等于 0,只有 1 个IsFinal等于 1。

我的问题是:对于每一个UserID,如果它有一个记录Isfinal = 1,我想忽略所有相同的记录UserID,否则我想返回它的记录。我不知道这是否只能通过 SQL 语句来完成。

4

3 回答 3

2

似乎您想要一个反加入,即您首先需要确定哪些用户 ID 具有IsFinal = 1,然后使用该结果集返回不在该列表中的所有用户 ID。

有多种方法可以实现反连接。

  1. NOT IN

    SELECT *
    FROM atable
    WHERE UserID NOT IN (
      SELECT UserID
      FROM atable
      WHERE IsFinal = 1
    );
    
  2. NOT EXISTS

    SELECT *
    FROM atable t1
    WHERE NOT EXISTS (
      SELECT *
      FROM atable t2
      WHERE t1.UserID = t2.UserID
        AND t2.IsFinal = 1
    );
    
  3. 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;
    

    b)

    SELECT *
    FROM atable t1
      LEFT JOIN atable t2
        ON t1.UserID = t2.UserID AND t2.IsFinal = 1
    WHERE t2.UserID IS NULL;
    

它们可能会在您的数据库中同样有效,但测试它们中的每一个以至少避免最终得到一个性能比其他更差的结果仍然可能是一个好主意。

于 2012-08-01T12:07:40.750 回答
0

我认为这就是你要找的:

SELECT a.*
FROM translations a
     INNER JOIN (SELECT UserID FROM translations WHERE IsFinal = 1) b
        ON a.UserID = b.UserID
WHERE IsFinal = 0;
于 2012-07-31T05:41:06.363 回答
0

尝试(未测试)

SELECT t1.* FROM table t1
INNER JOIN table t2 USING(indexID)
WHERE t1.IsFinal <>1
GROUP BY t1.UserID
于 2012-08-01T11:58:14.930 回答