1

4 つのフィールドを持つ単純なテーブルがあります。

indexID
UserID
text_1
IsFinal 

このテーブルは、各 に対して複数の値を持つことができUserIDIsFinalフィールドは 1 または 0 の 1 つの値のみを持つことができます。

私がやろうとしているのは、IsFinal0 に等しい場合にのみユーザー ID を返す select ステートメントを作成することです。問題は、同じ userID に対して複数のレコードが存在する可能性があり、一部はIsFinal0 に等しく、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:

    a)

    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;
    

データベース内で同じように効率的である場合もありますが、少なくとも 1 つが他のものよりもパフォーマンスが低下することを避けるために、それぞれをテストすることをお勧めします。

于 2012-08-01T12:07:40.750 に答える
0

TRY (未テスト)

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 に答える
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 に答える