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

kompleks sql-sætning til forskellige rækker

Det ser ud til, at du vil have en anti-join , dvs. du skal først fastslå, hvilke bruger-id'er der har IsFinal = 1 , og brug derefter dette resultatsæt til at returnere alle bruger-id'er ikke på den liste.

Der er forskellige måder at implementere en anti-join på.

  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;
    

Det kan ske, at de vil være lige så effektive i din database, men det kan stadig være en god idé at teste hver af dem for i det mindste at undgå at ende med en, der klarer sig dårligere end de andre.



  1. Krypter data i SQLite

  2. Introduktion til midlertidige tabeller i SQL Server

  3. Find dublerede strenge i databasen

  4. php 5.x 7.x, ssl pdo-fejl:Peer-certifikat CN=`someName' matchede ikke forventet CN='someIP'