Bonjour,
Voici donc le problème (sous Oracle 9.?) : l'utilisation d'une vue particulière, toujours la même, dans une jointure dans une requête entraîne des doublonnages de ligne mais uniquement lorsque j'utilise "directement" des fonctions d'agrégation. Sur un select simple ou en utilisant une sous requête dans la clause from, les résultats sont cohérents et jusqu'à preuve du contraire, il n'y a qu'une vue problématique dans la base.
Les 3 exemples ci-dessous sont une illustration "simplifiée" du problème (pour la situation réelle, imaginez les mêmes requêtes avec 10 ou 20 variables et 2 ou 3 tables en plus et 10 millions de lignes en sortie mais la problématique est la même : dès que la vue en question est intégrée dans la requête, les résultats "explosent") :
Exemple 1 : SELECT simple, résultat normal et conforme à l'attente :
Exemple 2 : SELECT avec agrégation, résultats anormaux avec doublonnage des lignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT A, B FROM V1 NATURAL JOIN V2; 4 lignes : A B Val1 3 Val2 1 Val2 2 Val2 1
Exemple 3 : SELECT avec agrégation mais utilisation d'une sous requête dans la clause FROM, résultats normaux et conformes à l'attente :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT A, SUM(B) AS SB, COUNT(*) AS Nb_lignes FROM V1 NATURAL JOIN V2 GROUP BY A; 2 lignes : A SB Nb_lignes Val1 6 2 Val2 8 6
Je comprends bien, d'un point de vue technique, que l'exemple 3 fonctionne puisque la sélection se fait sur l'ensemble valide de l'exemple 1 reconstitué par la sous requête mais, sauf erreur de ma part, d'un point de vue logique, FROM (SELECT * FROM V1 NATURAL JOIN V2) et FROM V1 NATURAL JOIN V2 sont strictement équivalents, d'où la question : quelqu'un peut-il m'expliquer de ce qui peut provoquer le dérapage de l'exemple 2 ?!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT A, SUM(B) AS SB, COUNT(*) AS Nb_lignes FROM (SELECT * FROM V1 NATURAL JOIN V2) GROUP BY A; 2 lignes : A SB Nb_lignes Val1 3 1 Val2 4 3
Merci d'avance
(et avec toutes mes excuses si le problème n'est pas clair, a déjà été traité sans que je le retrouve ou si je ne suis pas dans la bonne rubrique pour le faire : je ne savais pas trop où aller dans la mesure où j'y suis confronté en tant qu'utilisateur mais qu'il relève a priori de l'administration)
Partager