Heim  >  Fragen und Antworten  >  Hauptteil

Geben Sie die Zeile nur zurück, wenn der Wert nicht vorhanden ist

<p>Ich habe 2 Tische - <code>Buchung</code>: </p> <pre class="brush:php;toolbar:false;">id | ----+------------------ 1 |. Wert 2|Wert 3 |. value</pre> <p>Zweite Tabelle – <code>reservation_log</code>: </p> <pre class="brush:php;toolbar:false;">id | ----+----------------+------------- 1 |. 1 | 2 |. 2 | 3 |. 3 | 4 |. 1 | 5 |. 2 |. Abbrechen</pre> <p>Ich muss nur Reservierungen auswählen, die nicht storniert sind (in diesem Fall nur ID 3). Ich kann „Abbrechen“ problemlos mit der einfachen Bedingung <code>WHERE change_type = cancel</code> auswählen, aber es fällt mir schwer, „Nicht abbrechen“ auszuwählen, da dies bei der einfachen Bedingung <code>WHERE</code> nicht der Fall ist Funktioniert hier nicht. </p>
P粉043470158P粉043470158422 Tage vor339

Antworte allen(2)Ich werde antworten

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

    Antwort
    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 测试会匹配这些行,因此它会找到表之间不匹配的所有行。

    Antwort
    0
  • StornierenAntwort