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

Vraťte řádek pouze v případě, že hodnota neexistuje

SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
                 FROM reservation_log
                 WHERE change_type = 'cancel')

NEBO:

SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL

První verze je intuitivnější, ale myslím, že druhá verze má obvykle lepší výkon (za předpokladu, že máte indexy ve sloupcích použitých ve spojení).

Druhá verze funguje, protože LEFT JOIN vrátí řádek pro všechny řádky v první tabulce. Když je ON podmínka je úspěšná, tyto řádky budou zahrnovat sloupce z druhé tabulky, stejně jako INNER JOIN . Když podmínka selže, vrácený řádek bude obsahovat NULL pro všechny sloupce ve druhé tabulce. WHERE l.id IS NULL test pak tyto řádky porovná, takže najde všechny řádky, které se mezi tabulkami neshodují.



  1. PDO fetchAll seskupuje páry klíč–hodnota do pole asociace

  2. Jak zastavit nebo ovládat značky při kontrole chyb v Microsoft Access

  3. Získat seznam všech tabulek v Oracle?

  4. Sloučte dvě tabulky do jednoho SQL dotazu a vytvořte jedinečné hodnoty data