Forum Programmation.SQL tester et savoir si id n'existe pas

Posté par  .
Étiquettes : aucune
-2
11
déc.
2009
Bonjour,


Je souhaites en une requête **fournir une liste de id** et **obtenir la liste des id** qui n'existe pas.

La requête suivante ne fonctionne qu'avec un seul id (ici 999999), comment la transformer pour qu'elle puissent fonctionner avec plus d'un id ?

select a.id
from (select 999999 AS id) AS a
LEFT JOIN test AS b ON (b.id = a.id)
WHERE b.id IS NULL

Merci énormément !
  • # contradicatoire

    Posté par  . Évalué à 2.

    comme tu veux fournir la liste de ID qui existent
    et avoir la liste des ID qui n'existent pas

    ce sont d'apres moi 2 requetes contradictoires

    soit tes IDs parmi un intervalle de 1 à 10 (pour exemple)
    la liste des IDs qui existent va te renvoyer 1|2|3|5|8|9
    la liste des IDs qui n'existent pas, c'est l'inverse de la requete precedente
    et ca te renvoie 4|6|7|10

    la jointure des deux te renvoie forcement ton intervalle de 1 à 10

    ou alors le probleme n'est pas correctement formulé
    • [^] # Re: contradicatoire

      Posté par  . Évalué à 1.

      Bonjour,

      Merci de ton commentaire.
      Cependant je ne sais pas comment arriver à "ca te renvoie 4|6|7|10".

      Je reformule ma question suivant ta remarque :

      La partie "(select 999999 AS id)" doit être construite avec une liste de id provenant d'une entrée.
      Ma première idée était "(select IN(456, 999999, 123) AS id)" mais cela ne fonctionne pas (erreur de syntaxe).
      Quel syntaxe utilisé pour arriver à "(select IN(456, 999999, 123) AS id)" ?


      Merci.
      • [^] # Re: contradicatoire

        Posté par  . Évalué à 1.

        Si les IDs de ton ensemble existent déjà dans une table, tu utilises la requête de mon commentaire ci-dessous et tu ajoutes « AND a.id IN (456, 999999, 123) ».
  • # Jointure ouverte ?

    Posté par  . Évalué à 2.

    Ce n'est pas très clair : sélectionner l'ensemble des IDs qui existent et qui n'existent pas revient à sélectionner toutes les ID possibles, indépendamment des tables qui les emploient. Il y en a potentiellement une infinité. En pratique, cela va dépendre du type que tu utilises pour le champ ID.

    Si, par contre, tu veux sélectionner un ensemble d'ID depuis une table donnée et ne retenir que celles qui n'apparaissent pas dans une seconde table, il faut passer par une jointure ouverte.

    SELECT a.id
    FROM PremiereTable a
    LEFT OUTER JOIN SecondeTable b
    ON b.id = a.id
    WHERE b.id IS NULL
    • [^] # Re: Jointure ouverte ?

      Posté par  . Évalué à 1.

      Si tu mets « LEFT JOIN » ça sera une jointure ouverte (le « OUTER » est implicite).


      Remarque, on pourrait faire sans :
      SELECT id
      FROM table_contenant_toutes_les_ids
      WHERE id NOT IN ( SELECT id FROM table_des_ids_réservés )

      Comment ça c'est moche ?
      • [^] # Re: Jointure ouverte ?

        Posté par  . Évalué à 1.

        je suis pas sûr que ça répond à la question de départ, mais ce que tu écris là, ça serait plus joli comme ça:

        SELECT t1.id
        FROM table_contenant_toutes_les_ids t1
        WHERE NOT EXISTS (SELECT 1 FROM table_des_ids_réservés t2 WHERE t1.id = t2.id)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.