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

Langage SQL Discussion :

Trouver les lignes d'une table sans correpondance dans une autre ?


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    nad
    nad est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 38
    Par défaut Trouver les lignes d'une table sans correpondance dans une autre ?
    Bonjour,

    J'ai 2 tables :
    la table PLI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE PLI ( 
      NUM_LOT        VARCHAR2 (6)  NOT NULL, 
      DT_LOT         DATE          NOT NULL, 
      NUM_PLI        VARCHAR2 (3)  NOT NULL,
    ....
    PRIMARY KEY (  NUM_LOT, DT_LOT, NUM_PLI ) ) ;
    et la table DOCS qui contient des documents associés au pli.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE DOCS ( 
    IDX_DOC     NUMBER        NOT NULL,
      NUM_LOT        VARCHAR2 (6)  NOT NULL, 
      DT_LOT         DATE          NOT NULL, 
      NUM_PLI        VARCHAR2 (3)  NOT NULL,
    ...
    PRIMARY KEY (  IDX_DOC ) ) ;
    Je voudrais savoir s'il est possible de faire une requête qui me ramène les plis qui n'ont pas de documents, c'est à dire les lignes de la table PLI qui n'ont pas de lignes correspondantes dans la table DOCS. Et si c'est possible, comment ?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    C'est tout a fait possibe !
    Et ce, de plusieurs facons.

    Notamment l'utilisation du NOT EXISTS
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     SELECT num_lot 
    FROM
      PLI 
    WHERE
      NOT EXISTS
         ( SELECT num_lot
            FROM docs
            WHERE
                pli.num_lot = docs.num_lot)
    Bon courage

  3. #3
    nad
    nad est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 38
    Par défaut
    ça marche, merci.
    Par contre comme la clef primaire est sur 3 champs, je suis obligée de les concaténer et surtout je suis obligée de répéter la concaténation dans la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select trim(num_lot) || '-' || to_char(dt_lot,'YYYYMMDD') || '-' ||  trim(num_pli) as clef, 
    	   pli_sta_ident, 
    	   flag_sup
    from  PLI
    where not exists (
    	  	  select trim(docs.num_lot) || '-' || to_char(docs.dt_lot,'YYYYMMDD') || '-' ||  trim(docs.num_pli) as clef2
    		  from  DOCS
    		  where trim(docs.num_lot) || '-' || to_char(docs.dt_lot,'YYYYMMDD') || '-' ||  trim(docs.num_pli) = trim(pli.num_lot) || '-' || to_char(pli.dt_lot,'YYYYMMDD') || '-' ||  trim(pli.num_pli)
    )
    and (not flag_sup = '1' or flag_sup is null)
    je voudrais faire qui serait plus simple à écrire
    mais ça ne focntionne pas
    Mais bon, c'est un autre problème...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    As-tu essayé cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  ...
    FROM    PLI
    WHERE   NOT EXISTS 
            (   SELECT 0
                FROM  docs
                WHERE docs.num_lot  = PLI.num_lot
                  AND docs.dt_lot   = PLI.dt_lot
                  AND docs.num_pli  = PLI.num_pli
            )
        AND ...
    EXISTS n'utilise pas les colonnes retournées par la sous-requête, inutile donc d'en spécifier
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    nad
    nad est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 38
    Par défaut
    Non, je n'avais pas essayé mais effectivement, ça marche aussi et c'est carrément plus rapide.
    Merci beaucoup

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Ou tout bêtement avec un LEFT JOIN, ce qui évite la sous-requête (c'est théoriquement plus rapide encore) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT PLI.*
    FROM PLI
    LEFT JOIN DOCS ON PLI.num_lot  = DOCS.num_lot
                  AND PLI.dt_lot   = DOCS.dt_lot
                  AND PLI.num_pli  = DOCS.num_pli
    WHERE DOCS.num_lot IS NULL
    Ca devrait suffire, je pense...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/03/2009, 19h31
  2. Recherche d'une valeur présent dans une table mais pas dans une autre
    Par bossLINDROS dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/06/2008, 15h12
  3. Ce qui est dans une table mais pas dans l'autre !
    Par youyoule dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/12/2007, 12h57
  4. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 18h08
  5. Réponses: 1
    Dernier message: 12/04/2007, 17h08

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