Maison  >  Questions et réponses  >  le corps du texte

Renvoie la ligne uniquement si la valeur n'existe pas

<p>J'ai 2 tables - <code>Réservation</code> : </p> <pre class="brush:php;toolbar:false;">id some_other_column | ----+------------------ 1 | valeur 2|valeur 3 | valeur</pré> <p>Deuxième tableau - <code>reservation_log</code> : </p> <pre class="brush:php;toolbar:false;">id | ----+----------------+------------- 1 | 1 | créer 2 | 2 | créer 3 | 3 | créer 4 | 1 | annuler 5 | 2 | annuler</pré> <p>Je dois uniquement sélectionner les réservations qui ne sont pas annulées (juste l'ID 3 dans ce cas). Je peux facilement sélectionner "Annuler" en utilisant la simple condition <code>WHERE change_type = Cancel</code>, mais j'ai du mal à sélectionner "Ne pas annuler" car la simple condition <code>WHERE</code> ça ne marche pas ici, effet. ≪/p >
P粉043470158P粉043470158422 Il y a quelques jours336

répondre à tous(2)je répondrai

  • P粉596161915

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

    répondre
    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')

    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.

    répondre
    0
  • Annulerrépondre