Merci de m'avoir consacré du temps
et mes excuses car mon post était un cas typique de question mal posée avec des exemples erronés suite à un problème mal compris (à décharge, le soucis avait à l'origine été rencontré par une collègue).
A défaut d'être "résolu", le problème est maintenant compris et voilà l'explication (suivie malgré tout d'une question), au cas où elle pourrait intéresser quelqu'un.
En fait, les requêtes retournent des résultats incohérents lorsqu'elles sont de la forme
SELECT {liste de variables quelconques} FROM V1 NATURAL JOIN V2 NATURAL JOIN V3;
La liste de variables peut inclure ou nom des fonctions d'agrégation (avec bien sur un GROUP BY adapté en plus), ça n'a pas d'importance.
Par contre, les résultats sont cohérents si la requête est de la forme
SELECT * FROM V1 NATURAL JOIN V2 NATURAL JOIN V3;
ou de la forme
SELECT {liste de variables quelconques} FROM V1 NATURAL JOIN (V2 NATURAL JOIN V3);
ou (parfois) de la forme
SELECT {liste de variables quelconques} FROM V2 NATURAL JOIN V3 NATURAL JOIN V1;
Mais
SELECT {liste de variables quelconques} FROM (V1 NATURAL JOIN V2) NATURAL JOIN V3;
retourne aussi des résultats incohérents...
Pour info, il y a de 0 à n lignes dans V3 pour chaque ligne de V2 et de 1 à n lignes dans V2 pour chaque ligne de V3.
Le problème est que les tables V2 et V3 ont 8 variables communes alors que la table V1 n'a que 7 variables communes avec les tables V2 et V3 et que, par défaut, Oracle n'utilise que les 7 variables communes aux 3 tables pour l'ensemble des jointures.
La jointure ne se passe correctement avec le NATURAL JOIN que si la jointure entre V2 et V3 est exécutée "de force" avant celle avec V1 ou si la 8e variable de jointure (commune à V2 et V3) est mentionnée dans le SELECT (d'où le fonctionnement cohérent du SELECT *), auquel cas Oracle semble se rappeler qu'il est censé s'en servir...
Je sais que ce n'est pas un fonctionnement normal, Oracle étant censé, lors d'une jointure à plus de 2 tables, associer une paire de tables puis associer le résultat à une autre table et ainsi de suite (http://download-west.oracle.com/docs...s7.htm#2054014), sans parler des variables sélectionnées qui ont un impact sur la jointure... mais j'aimerais savoir si c'est un bug connu et généralisé d'Oracle (auquel cas je m'excuse encore une fois de vous faire perdre votre temps) ou s'il peut être lié à une caractéristique particulière de notre base et, éventuellement, corrigé ?
Merci d'avance
Partager