Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/05/2011, 13h27   #1
Nouveau Membre du Club
 
Femme
Administrateur de base de données
Inscription : avril 2004
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : avril 2004
Messages : 41
Points : 28
Points : 28
Par défaut [Oracle 10g] Combinaison de RIGHT et INNER joins

Bonjour

Ca a l'air d'un probleme classique, mais je ne trouve rien sur le forum...

Dans un datawarehouse, nous avons 3 tables liées par un right join et un inner join et les resultats ne sont pas bons.

On souhaite avoir toutes les valeurs de la dimension (MD=master data), meme si elles n'ont pas de ligne correspondante dans la table de fait (FACT) : dans ce cas le total affiché sera NULL.

(1) Query donnant des resultats partiels : le outer join ne semble pas fonctionner car on obtient la meme chose que si l'on fait un INNER JOIN entre MD et FACT, c'est a dire seulement les dimensions avec des lignes dans FACT
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 SELECT
  MD.DIMENSION,   sum(fact.TOTALEURO)    
FROM
  T1_FACT  fact 
  RIGHT OUTER JOIN V1_MASTERDATA  MD 
          ON (MD.DIMENSION=FACT.DIMENSION)
   INNER JOIN V1_CALENDAR CAL 
        ON (FACT.IDFISCALYEAR= CAL.NOYEAR AND  
              FACT.IDFISCALMONTH=CAL.NOMONTH)
WHERE
    CAL.NOMONTH  =  04   AND  CAL.NOYEAR  =  2011
GROUP BY   MD.DIMENSION
(2) Query donnant des resultats corrects (les valeurs de MD.DIMENSION sans TOTALEURO sont affichees) :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT
  MD.DIMENSION,   sum(fact.TOTALEURO)    
FROM
  (SELECT *  FROM  T1_FACT  fact ,V1_CALENDAR CAL 
   WHERE FACT.IDFISCALYEAR= CAL.NOYEAR AND    
            FACT.IDFISCALMONTH=CAL.NOMONTH AND
           CAL.NOMONTH  =  04   AND  CAL.NOYEAR  =  2011) F
  RIGHT OUTER JOIN V1_MASTERDATA  MD 
ON (MD.DIMENSION=F.DIMENSION)
GROUP BY  MD.DIMENSION
Comme la query est générée par BO, on doit trouver une autre solution car one ne peut pas la réécrire telle qu'en (2), mais j'aimerais d'abord comprendre pourquoi cela ne fonctionne pas.


A noter : V1_CALENDAR est une vue sur une table Calendar ,avec un where qui limite la liste des dates possibles
V1_MASTERDATA est une vue sur la table MasterData, avec un where qui limite les dimensions aux valeurs "courantes"
Je ne sais pas si cela peut avoir un impact sur la query.


Merci d'avance si quelqu'un a une explication et pourquoi pas une idée de remplacement
Isa
isa06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 14h56   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
FACT Outer join Md => les lignes de MD et FACT plus les lignes de MD sans FACT. Conséquence: valuers nulles pour Fact.IDFISCALYEAR, etc.
Mais lors de la jointure avec CAL ces lignes n'ont pas de correspondance dans CAL.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 15h24   #3
Nouveau Membre du Club
 
Femme
Administrateur de base de données
Inscription : avril 2004
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : avril 2004
Messages : 41
Points : 28
Points : 28
Merci, je comprends le probleme.

Peut-on dire a Oracle de faire d'abord l'INNER JOIN afin de constituer la liste de lignes sur lesquelles on pourra ensuite faire le RIGHT JOIN ?

Ou bien la seule facon est de faire une sub-query entre FACT et CALENDAR pour avoir d'abord toutes les lignes puis utiliser un RIGHT JOIN sur cette sub-query...comme en (2) ?
isa06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 16h35   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Peut être il sera intéressante pour vous de lire "Data Densification for Reporting".

[Edit]
Mea culpa! Modifié le lien!
[/Edit]
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 16h38   #5
Nouveau Membre du Club
 
Femme
Administrateur de base de données
Inscription : avril 2004
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : avril 2004
Messages : 41
Points : 28
Points : 28
Oui la densification, c'est ce que nous cherchons a faire
... mais le lien ne marche pas
isa06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h17.


 
 
 
 
Partenaires

Hébergement Web