Rumah  >  Soal Jawab  >  teks badan

Kembalikan baris hanya jika nilai tidak wujud

<p>Saya ada 2 jadual - <kod>Tempahan</kod>: </p> <pre class="brush:php;toolbar:false;">id | ----+------------------ 1 | 2|nilai 3 |. nilai</pra> <p>Jadual kedua - <kod>log_tempahan</kod>: </p> <pre class="brush:php;toolbar:false;">id reservation_id | ----+----------------+------------- 1 |. 1 | 2 |. 2 | 3 |. 3 | 4 |. 1 | 5 |. 2 |. <p>Saya hanya perlu memilih tempahan yang tidak dibatalkan (hanya ID 3 dalam kes ini). Saya boleh memilih "Batal" dengan mudah menggunakan syarat <kod>WHERE change_type = cancel</code> tetapi saya sukar memilih "Jangan batalkan" kerana <kod>WHERE</code> 't bekerja di sini kesan. </p >
P粉043470158P粉043470158422 hari yang lalu341

membalas semua(2)saya akan balas

  • P粉596161915

    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'
    );

    balas
    0
  • P粉692052513

    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.

    balas
    0
  • Batalbalas