sql >> データベース >  >> RDS >> Mysql

異なる行への複雑なSQLステートメント

    反参加が必要なようです つまり、最初に、どのユーザー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. グループ化されたMySQLデータから最新の日付を取得する

    2. SQLServerの宛先とOLEDBの宛先

    3. Count(*)がゼロの場合はNULLを返します

    4. MySQLの2つの列をチェックする一意の制約