Bonjour,

La table ARTICLESPOSSEDES décrit la liste des articles que possède chaque personne. Une ligne correspond à un
article (représenté par un numéro pour simplifier) possédé par une personne. Pour connaître tous les articles
que possède une personne donnée, il faut exécuter la requête :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT ARTICLE FROM ARTICLESPOSSEDES WHERE NOM = <Nom personne>;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
SQL> DESC ARTICLESPOSSEDES
Name      Type         Nullable Default Comments                             
--------- ------------ -------- ------- ------------------------------------ 
NOM       VARCHAR2(10)                  Nom               
ARTICLE   NUMBER(3)                     Article possédé
La table PERSONNE stocke une liste de personnes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
SQL> DESC PERSONNE
Name    Type         Nullable Default Comments                       
------- ------------ -------- ------- ------------------------------ 
ID       NUMBER(4)                     Identifiant  
TYPE     NUMBER(3)                     Type d'emploi occupé
NOM      VARCHAR2(10)                  Nom 
PRENOM   VARCHAR2(10)                  Prénom 
Tel      NUMBER(4)                     Numéro de téléphone 
Age      NUMBER(3)                     Age
Je veux exécuter une requête qui indique si une personne de type 100 et d'âge 20 ans possède ou non, comme TOTO, l'article 200.
Le cas échéant, la requête doit me renvoyer la ligne concernée, sinon, elle ne doit rien me renvoyer.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT *  
FROM Personne P  
WHERE P.ID = 100  
AND P.AGE = 20
AND  (SELECT COUNT(1) 
      FROM ARTICLESPOSSEDES A     
      WHERE A.NOM='TOTO' 
      AND A.ARTICLE=200) 
             =  	
      (SELECT COUNT(1) 
      FROM ARTICLESPOSSEDES A 
      WHERE A.ARTICLE=F.FWEPROF 
      AND A.ARTICLE=200)
1er cas
TOTO possède l'article 200 et il existe des personnes de type 100 et d'âge 20 ans qui possèdent le susdit article, alors
ma requête doit me renvoyer la liste de ces personnes.

2nd cas
TOTO possède l'article 200 et personne de type 100 et d'âge 20 ans ne possède le susdit article, alors, ma requête
ne doit rien me renvoyer.

3ième cas
TOTO ne possède pas l'article 200 et il existe des personnes de type 100 et d'âge 20 ans qui possèdent le susdit article, alors, ma requête
ne doit rien me renvoyer du tout non plus.

Ces trois cas-là fonctionne très bien, j'obtiens les réponses appropriées.

En revanche, il en est autrement avec le 4ième cas :
TOTO ne possède pas l'article 200 et personne non plus de type 100 et d'âge 20 ans ne possèdent cet article. Le requête
me renvoie une liste vide, alors qu'elle devrait me renvoyer au moins une ligne.

Je précise quand même qu'il existe évidemment des personnes de type 100 et d'âge 20 ans dans la table PERSONNE.

La requête

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
SELECT COUNT(1) 
      FROM ARTICLESPOSSEDES A     
      WHERE A.NOM='TOTO' 
      AND A.ARTICLE=200
me renvoie 1, si TOTO possède l'article, 0 sinon. :