Bonjour,
j'ai les 3 tables suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE TABLE T1 (ID1 VARCHAR2(01) ,CONSTRAINT PK_T1 PRIMARY KEY (ID1));
INSERT INTO T1 (ID1) VALUES ('1');
INSERT INTO T1 (ID1) VALUES ('2');
INSERT INTO T1 (ID1) VALUES ('3');
INSERT INTO T1 (ID1) VALUES ('4');
INSERT INTO T1 (ID1) VALUES ('5');
 
CREATE TABLE T2 (ID2 VARCHAR2(01) ,CONSTRAINT PK_T2 PRIMARY KEY (ID2));
INSERT INTO T2 (ID2) VALUES ('A');
INSERT INTO T2 (ID2) VALUES ('B');
INSERT INTO T2 (ID2) VALUES ('C');
INSERT INTO T2 (ID2) VALUES ('D');
INSERT INTO T2 (ID2) VALUES ('E');
 
CREATE TABLE T3 (ID1 VARCHAR2(1) ,ID2 VARCHAR2(1) ,ID3 VARCHAR2(1) ,CONSTRAINT PK_T3 PRIMARY KEY (ID1,ID2,ID3), CONSTRAINT FK_T3_1 FOREIGN KEY (ID1) REFERENCES T1(ID1), CONSTRAINT FK_T3_2 FOREIGN KEY (ID2) REFERENCES T2(ID2));
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('1', 'A', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('1', 'A', '2');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('1', 'C', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('2', 'A', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('2', 'B', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('2', 'C', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('3', 'A', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('3', 'B', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('3', 'B', '2');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('3', 'C', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('3', 'D', '1');
INSERT INTO T3 (ID1, ID2, ID3) VALUES ('5', 'D', '1');
Quel le moyen le plus performant de trouver la liste des T3.ID1 dont au-moins un T3.ID2 est absent de la liste ('A','B','C')?
Résutat:
Ma solution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
SELECT DISTINCT ID1
FROM (
  SELECT T1.ID1,T2.ID2 
  FROM T1
  CROSS JOIN T2
  WHERE ID2 IN ('A','B','C')
)
WHERE (ID1,ID2) NOT IN (SELECT ID1,ID2 FROM T3)