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