sql >> Base de Datos >  >> RDS >> Mysql

instrucción sql compleja a diferentes filas

Parece que quieres un anti-join , es decir, primero debe establecer qué ID de usuario tienen IsFinal = 1 , luego use ese conjunto de resultados para devolver todos los ID de usuario no en esa lista.

Hay varias formas de implementar una anti-unión.

  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;
    

Puede suceder que sean igualmente eficientes en su base de datos, pero aun así puede ser una buena idea probar cada uno de ellos para al menos evitar terminar con uno que funciona peor que los demás.