首頁  >  問答  >  主體

僅當值不存在時回傳行

<p>我有 2 張桌子 - <code>預訂</code>:</p> <pre class="brush:php;toolbar:false;">id | some_other_column ---- ------------------ 1 | value 2 | value 3 | value</pre> <p>第二個表 - <code>reservation_log</code>:</p> <pre class="brush:php;toolbar:false;">id | reservation_id | change_type ---- ---------------- ------------- 1 | 1 | create 2 | 2 | create 3 | 3 | create 4 | 1 | cancel 5 | 2 | cancel</pre> <p>我只需要選擇未取消的預訂(本例中僅為 ID 3)。 我可以使用簡單的<code>WHERE change_type = cancel</code> 條件輕鬆選擇“取消”,但我很難選擇“不取消”,因為簡單的<code>WHERE</code> 在這裡不起作用。 </p >
P粉043470158P粉043470158422 天前338

全部回覆(2)我來回復

  • P粉596161915

    P粉5961619152023-08-25 09:32:07

    為了完整起見(我真的相信它更適合),我鼓勵您使用簡單的 NOT EXISTS

    SELECT * FROM reservation R
    WHERE NOT EXISTS (
      SELECT 1 FROM reservation_log
      WHERE reservation_id = R.id
        AND change_type = 'cancel'
    );

    回覆
    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')

    或:

    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

    第一個版本更直觀,但我認為第二個版本通常會獲得更好的效能(假設您在聯接中使用的列上有索引)。

    第二個版本有效,因為 LEFT JOIN 會為第一個表中的所有行傳回一行。當 ON 條件成功時,這些行將包含第二個表中的列,就像 INNER JOIN 一樣。當條件失敗時,傳回的行將包含第二個表中所有列的 NULL。然後,WHERE l.id IS NULL 測試會符合這些行,因此它會找到表之間不匹配的所有行。

    回覆
    0
  • 取消回覆