Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau Candidat au Club
    Ordre SQL pour trouver les valeurs qui n'existent pas parmi une liste de valeurs
    Bonjour,
    Je souhaiterai trouver les valeurs, parmi une liste de valeurs définie qui n'existent pas dans une table.
    Par exemple dans une table "table1" ayant la colonne "colonne1", il existe les enregistrements suivants :
    colonne1
    1
    2
    3

    et soit la liste de valeurs 1,2,3,4

    je souhaite que la requete SQL me retourne 4 car la valeur 4 n'existe pas dans la table "table1"

    Est-ce que quelqu'un aurait une idée ?

    Merci
    Cordialement

  2. #2
    Rédacteur

    EXCEPT est l'opérateur normalisé de l'algèbre relationnelle pour ce faire
    A me lire : https://sqlpro.developpez.com/cours/...embles/#L3.4.3

    Oracle se distingue en l'appelant MINUS....

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Expert éminent
    Tout dépend de ton format de liste de valeur.
    Il faut transformer ta liste de valeur en lignes de vue ou table
    Si c'est déjà dans une table, un simple MINUS suffira. Sinon transformer une chaîne de caractère en lignes, ça peut être fait en XML
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT EXTRACTVALUE(COLUMN_VALUE,'e') lst
    FROM TABLE(XMLSEQUENCE(XMLTYPE('<e><e>' || REPLACE('1,2,3,4', ',', '</e><e>')|| '</e></e>').EXTRACT('e/*')))
    MINUS
    SELECT col1 FROM matable


    ou en sql simple (mais en ayant une liste fixe de nombre (1 à 20 par exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT num FROM (SELECT LEVEL num FROM dual connect BY LEVEL <= 20)
    WHERE INSTR(','|| '1,2,3,4' ||',', ','|| num ||',') > 0
    MINUS
    SELECT col1 FROM matable
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Nouveau Candidat au Club
    merci pour vos réponses.
    Je vais donc passer par la création d'une table temporaire et remplir cette table temporaire par la liste de valeurs .
    Puis faire un minus entre la table et cette table temporaire.
    Merci
    Cordialement

  5. #5
    Membre expert
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  6. #6
    Expert éminent
    Bonjour,
    Il s'agit d'un ANTI JOIN qui s'écrit avec un NOT IN ou NOT EXISTS
    MINUS c'est pour soustraire sur des lignes completes. Ici la question est sur des valeurs, et utiliser MINUS empêcherait d'utiliser un accès rapide à la table (via index, nested loop,... suivant le nombre de valeurs).

    Exemple:
    https://dbfiddle.uk/?rdbms=oracle_18&fiddle=f1dd0069425b5ac935135d65d77229f5

    Effectivement une table temporaire peut être utilisée. Ou une collection (table of number).
    Franck Pachot - dbi services - Consulting et Formation en Suisse et remote - fpa@dbi-services.com
    &#128483; twitter: @FranckPachot - &#128221; blog: blog.pachot.net - &#127911; podcast en français : https://anchor.fm/franckpachot

###raw>template_hook.ano_emploi###