IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

SQL Oracle Discussion :

Ordre SQL pour trouver les valeurs qui n'existent pas parmi une liste de valeurs


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Septembre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Septembre 2020
    Messages : 2
    Par défaut 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

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    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

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Septembre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Septembre 2020
    Messages : 2
    Par défaut
    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
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    +
    avec regexp et connect by
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT LEVEL AS id, REGEXP_SUBSTR('1,2,3,4', '[^,]+', 1, LEVEL) AS data
        FROM dual
    CONNECT BY REGEXP_SUBSTR('1,2,3,4', '[^,]+', 1, LEVEL) IS NOT NULL;
    ou version insensible au séparateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT REGEXP_SUBSTR('
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1;2:3+4', '[[:digit:]]+', 1, LEVEL) AS value FROM dual 
                CONNECT BY REGEXP_SUBSTR('1;2:3+4', '[[:digit:]]+', 1, LEVEL) IS NOT NULL ;
    
    avec json_table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select subs from json_table(
    replace(json_array('1,2,3,4'), ',', '","'),
    '$[*]' columns (
    subs varchar2(4000) path '$'
    )
    );
    
    etc.

    en plus à part le MINUS/EXCEPT, vous pouvez aussi faire un "where not exists"...

    ... c'est pas les choix et combinaisons qui manquent...

  6. #6
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    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).

Discussions similaires

  1. méthode pour trouver les répertoires qui ne contiennent pas
    Par carles38150 dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 23/03/2020, 21h51
  2. Réponses: 7
    Dernier message: 07/02/2018, 15h18
  3. [2012] Requête pour trouver des produits qui ne sont pas dans une table ?
    Par zoocoral dans le forum Développement
    Réponses: 5
    Dernier message: 12/01/2017, 17h11
  4. Réponses: 4
    Dernier message: 07/05/2011, 11h50
  5. supprimer les fichiers qui ne sont pas dans une liste
    Par jeorcal dans le forum Langage
    Réponses: 7
    Dernier message: 15/01/2011, 10h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo