sql >> Databáze >  >> RDS >> Mysql

komplexní příkaz SQL do různých řádků

Zdá se, že chcete anti-join , tj. nejprve musíte určit, která uživatelská ID mají IsFinal = 1 , pak použijte tuto sadu výsledků k vrácení všech ID uživatelů ne v tomto seznamu.

Anti-join lze implementovat různými způsoby.

  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;
    

Může se tak stát, že budou ve vaší databázi stejně výkonné, ale přesto může být dobrý nápad otestovat každý z nich, abyste se alespoň vyhnuli tomu, že skončí s tím, který má horší výkon než ostatní.



  1. Klauzule ORDER BY je neplatná v pohledech, vložených funkcích, odvozených tabulkách, poddotazech a běžných tabulkových výrazech.

  2. Konstruktor SQLiteOpenHelper() není definován

  3. Co je Microsoft Access? Stručný úvod pro nové uživatele

  4. utf8_bin vs. utf_unicode_ci