Mysql
 sql >> Database >  >> RDS >> Mysql

istruzione sql complessa su righe diverse

Sembra che tu voglia un anti-join , ovvero devi prima stabilire quali ID utente hanno IsFinal = 1 , quindi utilizza quel set di risultati per restituire tutti gli ID utente non in quell'elenco.

Esistono vari modi per implementare un'anti-unione.

  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;
    

Può succedere che siano ugualmente efficienti nel tuo database, ma potrebbe comunque essere una buona idea testarli almeno per evitare di trovarne uno con prestazioni peggiori degli altri.