Rumah > Soal Jawab > teks badan
P粉5961619152023-08-25 09:32:07
Demi kesempurnaan (dan saya sangat percaya ia lebih sesuai), saya menggalakkan anda menggunakan yang mudah 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')
atau:
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
Versi pertama lebih intuitif, tetapi saya fikir anda secara umumnya akan mendapat prestasi yang lebih baik dengan versi kedua (dengan mengandaikan anda mempunyai indeks pada lajur yang digunakan dalam gabungan).
Versi kedua berfungsi kerana LEFT JOIN mengembalikan satu baris untuk semua baris dalam jadual pertama. Apabila ON
条件成功时,这些行将包含第二个表中的列,就像 INNER JOIN
一样。当条件失败时,返回的行将包含第二个表中所有列的 NULL
。然后,WHERE l.id IS NULL
ujian memadankan baris ini, jadi ia menemui semua baris yang tidak sepadan antara jadual.