sql >> Database >  >> RDS >> Mysql

Retourneer alleen rij als waarde niet bestaat

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

OF:

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

De eerste versie is intuïtiever, maar ik denk dat de tweede versie meestal betere prestaties levert (ervan uitgaande dat je indexen hebt op de kolommen die in de join worden gebruikt).

De tweede versie werkt omdat LEFT JOIN geeft een rij terug voor alle rijen in de eerste tabel. Wanneer de ON voorwaarde slaagt, bevatten die rijen de kolommen uit de tweede tabel, net als INNER JOIN . Als de voorwaarde faalt, bevat de geretourneerde rij NULL voor alle kolommen in de tweede tabel. De WHERE l.id IS NULL test komt dan overeen met die rijen, zodat het alle rijen vindt die geen overeenkomst hebben tussen de tabellen.



  1. Waarom mislukt mijn ODBC-verbinding bij het uitvoeren van een SSIS-belasting in Visual Studio, maar niet bij het uitvoeren van hetzelfde pakket met het hulpprogramma Pakket uitvoeren

  2. Vereist ODP.NET installatie van Oracle Client?

  3. 4 manieren om informatie te krijgen over de structuur van een tabel in SQLite

  4. Kan ik de naam krijgen van alle tabellen van de SQL Server-database in de C#-toepassing?