Maison > Questions et réponses > le corps du texte
P粉5961619152023-08-25 09:32:07
Par souci d'exhaustivité (et je pense vraiment que c'est plus approprié), je vous encourage à utiliser le simple NOT EXISTS
.
SELECT * FROM reservation R WHERE NOT EXISTS ( SELECT 1 FROM reservation_log WHERE reservation_id = R.id AND change_type = 'cancel' );
P粉6920525132023-08-25 00:35:13
SELECT * FROM reservation WHERE id NOT IN (select reservation_id FROM reservation_log WHERE change_type = 'cancel')
ou :
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
La première version est plus intuitive, mais je pense que vous obtiendrez généralement de meilleures performances avec la deuxième version (en supposant que vous ayez des index sur les colonnes utilisées dans la jointure).
La deuxième version fonctionne car LEFT JOIN renvoie une ligne pour toutes les lignes de la première table. Lorsque ON
条件成功时,这些行将包含第二个表中的列,就像 INNER JOIN
一样。当条件失败时,返回的行将包含第二个表中所有列的 NULL
。然后,WHERE l.id IS NULL
le test correspond à ces lignes, il trouve donc toutes les lignes qui ne correspondent pas entre les tables.