sql >> Database >  >> RDS >> Mysql

complexe sql-instructie naar verschillende rijen

Het lijkt erop dat je een anti-join . wilt , d.w.z. u moet eerst vaststellen welke gebruikers-ID's IsFinal = 1 hebben en gebruik vervolgens die resultatenset om alle gebruikers-ID's niet . te retourneren in die lijst.

Er zijn verschillende manieren om een ​​anti-join te implementeren.

  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;
    

Het kan gebeuren dat ze even efficiënt zijn in uw database, maar het kan toch een goed idee zijn om ze allemaal te testen om op zijn minst te voorkomen dat u er een krijgt die slechter presteert dan de andere.



  1. Microsoft Azure:wat het is en hoe uw bedrijf hiervan kan profiteren

  2. Ondersteunt jdbc de Perzische taal?

  3. Automatisch uitzonderingen opvangen voor PDO in PHP

  4. Een SQL-query schrijven om een ​​item uit de volgende tabel te SELECTEREN