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

Returner kun række, hvis værdien ikke eksisterer

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

ELLER:

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

Den første version er mere intuitiv, men jeg tror, ​​at den anden version normalt får bedre ydeevne (forudsat at du har indekser på de kolonner, der bruges i joinforbindelsen).

Den anden version virker fordi LEFT JOIN returnerer en række for alle rækker i den første tabel. Når ON betingelse lykkes, vil disse rækker inkludere kolonnerne fra den anden tabel, ligesom INNER JOIN . Når betingelsen mislykkes, vil den returnerede række indeholde NULL for alle kolonnerne i den anden tabel. WHERE l.id IS NULL test matcher derefter disse rækker, så den finder alle de rækker, der ikke matcher tabellerne.



  1. Sådan konverteres UTC-dato til lokal tidszone i MySql Vælg forespørgsel

  2. orakel - hvilke udtalelser skal begås?

  3. Kan ikke sende strengværdi 1,2 som input til en orakelforespørgsel

  4. Normalisering i MYSQL