Mysql
 sql >> Datenbank >  >> RDS >> Mysql

komplexe SQL-Anweisung in verschiedene Zeilen

Anscheinend wollen Sie einen Anti-Join , d.h. Sie müssen zunächst feststellen, welche Benutzerkennungen IsFinal = 1 haben , und verwenden Sie dann diese Ergebnismenge, um alle Benutzer-IDs nicht zurückzugeben in dieser Liste.

Es gibt verschiedene Möglichkeiten, einen Anti-Join zu implementieren.

  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;
    

Es kann vorkommen, dass sie in Ihrer Datenbank gleich effizient sind, aber es kann trotzdem eine gute Idee sein, sie alle zu testen, um zumindest zu vermeiden, dass am Ende einer schlechter abschneidet als die anderen.