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 :
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 CREATE TABLE tb_parents ( pk_par NUMBER, fk_par NUMBER, nom_par VARCHAR2(25), pre_par VARCHAR2(25) );
En fait, j'ai créé un table avec des données hiérarchiques.
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');
Lorsque j'envoie la requête suivante :
La base me répond ceci :
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);
Jusque là, tout va bien mais pour cette requête :PK_PAR
----------
1
2
3
4
5
J'obtiens la réponse 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 NOT IN (SELECT DISTINCT fk_par FROM tb_parents);
Aucune ligne sélectionnée. --> Je ne comprend pas pourquoi ???
car la sous requête toute seule
me répond :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT DISTINCT fk_par FROM tb_parents
Et si je fais ma requête de la manière suivante :FK_PAR
----------
1
2
4
5
17
3
J'obtiens la réponse 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);
Alors pourquoi est ce que ça ne marche pas avec avec ma sous requête utilisant lePK_PAR
----------
6
7
8
9
10
11
12
NOT IN ?????
Je ne cherche pas une solution de remplacement pour cette requête du style
Je voudrais simplement comprendre.
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;
Merci pour votre aide et bonne journée.
James
Partager