sql >> Databasteknik >  >> RDS >> Mysql

komplex sql-sats till olika rader

Det verkar som om du vill ha en anti-join , det vill säga du måste först fastställa vilka användar-ID:n som har IsFinal = 1 , använd sedan resultatuppsättningen för att returnera alla användar-ID:n inte i den listan.

Det finns olika sätt att implementera en anti-join.

  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 hända att de kommer att vara lika effektiva i din databas, men det kan ändå vara en bra idé att testa var och en av dem för att åtminstone undvika att hamna i en som presterar sämre än de andra.



  1. Hur man VÄLJER FRÅN lagrad procedur

  2. jQuery + PHP Autokomplettering

  3. Javascript-bibliotek som tillåter SQL-liknande frågor på JSON-data?

  4. Hur justify_interval() fungerar i PostgreSQL