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 :

Problème avec une sous-requête (requête imbriquée)


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Problème avec une sous-requête (requête imbriquée)
    Bonjour,

    J'ai un petit problème avec une requête imbriquée et je ne comprends pas pourquoi la
    réponse de la base est toujours la même. Je m'explique :

    J'ai créé un table contenant des personnes dont la syntaxe est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE tb_parents
      (
            pk_par  NUMBER,
            fk_par   NUMBER,
            nom_par VARCHAR2(25),
            pre_par VARCHAR2(25)
      );
    J'ai inséré des personnes à l'intérieurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    insert into tb_parents values (1, null, 'Renzi', 'Ercole');
    insert into tb_parents values (2, 1, 'Renzi', 'Umberto');
    insert into tb_parents values (3, 2, 'Renzi', 'Gerardo');
    insert into tb_parents values (4, 3, 'Renzi', 'Lorenzo');
    insert into tb_parents values (5, 3, 'Renzi', 'Lino');
    insert into tb_parents values (6, 4, 'Renzi', 'Kim');
    insert into tb_parents values (7, 5, 'Renzi', 'Lino');
    insert into tb_parents values (8, 17, 'Renzi', 'Francesca');
    insert into tb_parents values (9, 1, 'Renzi', 'Iolanda');
    insert into tb_parents values (10, 2, 'Renzi', 'Iolanda');
    insert into tb_parents values (11, null, 'Renzi', 'Simone');
    insert into tb_parents values (12, null, 'Renzi', 'Giulia');
    En fait, j'ai créé un table avec des données hiérarchiques.
    Lorsque j'envoie la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pk_par 
    FROM tb_parents 
    WHERE pk_par IN 
     (SELECT fk_par
      FROM tb_parents);
    La base me répond ceci :
    PK_PAR
    ----------
    1
    2
    3
    4
    5
    Jusque là, tout va bien mais pour cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pk_par 
    FROM tb_parents 
    WHERE pk_par NOT IN 
     (SELECT DISTINCT fk_par
      FROM tb_parents);
    J'obtiens la réponse suivante :
    Aucune ligne sélectionnée. --> Je ne comprend pas pourquoi ???

    car la sous requête toute seule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT fk_par
      FROM tb_parents
    me répond :

    FK_PAR
    ----------

    1
    2
    4
    5
    17
    3
    Et si je fais ma requête de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT pk_par 
    FROM tb_parents 
    WHERE pk_par NOT IN (1,2,4,5,17,3);
    J'obtiens la réponse suivante :

    PK_PAR
    ----------
    6
    7
    8
    9
    10
    11
    12
    Alors pourquoi est ce que ça ne marche pas avec avec ma sous requête utilisant le
    NOT IN ?????

    Je ne cherche pas une solution de remplacement pour cette requête du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pk_par
    FROM tb_parents
      MINUS
    SELECT fk_par
    FROM tb_parents;
    Je voudrais simplement comprendre.

    Merci pour votre aide et bonne journée.

    James

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Parce que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQL> select 2 from dual where 2 not in (select null from dual)
    no rows selected
    SQL> select 2 from dual where 2 not in (select 1 from dual)
     
             2
    ----------
             2
     
    1 row selected.

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    EXISTS ne pose pas ce problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT pk_par 
    FROM tb_parents 
    WHERE NOT EXISTS
     (SELECT 1
      FROM tb_parents
      WHERE pk_par = fk_par);

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

Discussions similaires

  1. Problème avec une requête imbriquée
    Par Shadam dans le forum Développement
    Réponses: 2
    Dernier message: 21/01/2013, 16h43
  2. problème avec une sous requete dans WHERE
    Par prikama dans le forum Débuter
    Réponses: 0
    Dernier message: 08/12/2012, 12h57
  3. [WD14] Problème avec une sous requête
    Par Raptor92 dans le forum WinDev
    Réponses: 4
    Dernier message: 13/04/2010, 13h54
  4. Problème avec une sous classe de Graphics2D
    Par Virgile le chat dans le forum 2D
    Réponses: 1
    Dernier message: 16/06/2007, 02h59
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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