Bonjour,
Voici un test case intéressant:
La Table de test:
Le phénomène ne se produit pas si la table n'est pas partitionée.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 drop table ZZ_TAB1; create TABLE ZZ_TAB1 ( DV_ID INTEGER NOT NULL, JE_ID INTEGER NOT NULL, PS_ID INTEGER NOT NULL, P_ID INTEGER NOT NULL, SP_ID INTEGER NOT NULL, JET_ID INTEGER NOT NULL, JE_NUM INTEGER, Rev_Num INTEGER) TABLESPACE users PARTITION BY LIST (DV_ID) ( PARTITION P002 VALUES (2) NOLOGGING NOCOMPRESS , PARTITION P032 VALUES (32) NOLOGGING NOCOMPRESS , PARTITION P035 VALUES (35) NOLOGGING NOCOMPRESS ) NOCOMPRESS NOCACHE NOPARALLEL MONITORING; Insert into ZZ_Tab1 Values (32,2590376,1,5,1,2,138,0); Insert into ZZ_Tab1 Values (32,2590540,1,5,1,2,138,1); Insert into ZZ_Tab1 Values (32,2590542,1,5,1,2,138,2); Insert into ZZ_Tab1 Values (32,2590544,1,5,1,2,138,3); Insert into ZZ_Tab1 Values (2,2590376,1,5,1,2,138,0); Insert into ZZ_Tab1 Values (2,2590540,1,5,1,2,138,1); Insert into ZZ_Tab1 Values (2,2590542,1,5,1,2,138,2); Insert into ZZ_Tab1 Values (2,2590544,1,5,1,2,138,3); Insert into ZZ_Tab1 Values (35,2590376,1,5,1,2,138,0); Insert into ZZ_Tab1 Values (35,2590540,1,5,1,2,138,1); Insert into ZZ_Tab1 Values (35,2590542,1,5,1,2,138,2); Insert into ZZ_Tab1 Values (35,2590544,1,5,1,2,138,3);
Voici la requête:
Le résultat en 11g 11.1.0.7 retourne 0 lignes.
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 SELECT aa.JE_ID, aa.Rev_Num FROM ZZ_TAB1 aa WHERE aa.DV_ID = 32 AND aa.JE_NUM = 138 AND aa.PS_ID = 1 AND aa.P_ID = 5 AND aa.SP_ID = 1 AND aa.Rev_Num = (SELECT MAX (je.Rev_Num) FROM ZZ_TAB1 je WHERE je.DV_ID = aa.DV_ID AND je.JE_NUM =aa.JE_NUM AND je.P_ID = aa.P_ID AND je.SP_ID = aa.SP_ID AND je.PS_ID = aa.PS_ID);
En 9i, la ligne avec Rev_Num = 3 est renvoyée.
Je suis partagé entre le fait de considérer le comportement comme normal ou comme un bug.
1) Normal car la sous requête utilise dans sa clause where des colonnes qui n'ont pas été sélectionnées par la requête parente.
Le truc étrange est que ceci fonctionne en 11g
2) Pas normal car si il a besoin d'une colonne pour satisfaire une sous requête, le plus simple est que l'optimiseur nous le signale.
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 SELECT aa.JE_ID, aa.Rev_Num FROM ZZ_TAB1 aa WHERE aa.DV_ID = 32 AND aa.JE_NUM = 138 AND aa.PS_ID = 1 AND aa.P_ID = 5 AND aa.SP_ID = 1 AND aa.Rev_Num = (SELECT MAX (je.Rev_Num) FROM ZZ_TAB1 je WHERE je.DV_ID = 32 AND je.JE_NUM =aa.JE_NUM AND je.P_ID = aa.P_ID AND je.SP_ID = aa.SP_ID AND je.PS_ID = aa.PS_ID);
Par exemple l'erreur "ORA-01785: ORDER BY item must be the number of a SELECT-list expression"
Quel est votre avis?
Merci
Jko
Partager