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 13/02/2007, 09h40   #1
Nouveau Membre du Club
 
Développeur informatique
Inscription : novembre 2005
Messages : 44
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2005
Messages : 44
Points : 26
Points : 26
Envoyer un message via MSN à An0d
Par défaut [9i] Multiple Left Outer Join

Salut à tous,

J'ai un petit soucis pour transposer une view écrite sous SQL Server, vers un Oracle 9i.

Cette fameuse requête, se présente comme ceci sous SQL Server:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
SELECT * FROM
([Requête]) t1
	LEFT OUTER JOIN t2 ON t2.[UserID] = t1.[UserID]
		AND t2.[FileID] = t1.[ID]
			LEFT OUTER JOIN t3 ON t1.[ID] = t3.[FileID]
				AND t3.[ClientGuid] = t2.[ClientGuid]
					INNER JOIN t4 ON t4.[ID] = t1.[ID]
 
WHERE (t2.[StatDate] =	(	SELECT MAX(StatDate)
				FROM [BLUP_DLStats]
				WHERE [UserID] = t1.[UserID]
					AND [FileID] = t1.[ID]
			)
	) OR
	(t2.[StatDate] IS NULL)
GO
J'ai essayé de transposer celà en Oracle comme ceci :

Code :
1
2
3
4
5
6
7
8
 
SELECT * FROM
([Requête]) T1, T2, T3, T4
WHERE T1."UserID" = T2."UserID"(+)
	AND T1."ID" = T2."FileID"(+)
		AND T1."ID" = T3."FileID"(+)
			AND T2."ClientGuid" = T3."ClientGuid"(+)
				AND T1."ID" = T4."ID"
J'obtiens alors une erreur ORA-01417

Auriez-vous une solution pour faire passer ce "multiple left outer join" ?

Merci d'avance.
An0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 09h52   #2
Nouveau Membre du Club
 
Développeur informatique
Inscription : novembre 2005
Messages : 44
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2005
Messages : 44
Points : 26
Points : 26
Envoyer un message via MSN à An0d
J'ai peut-être une solution, mais si vous trouvez mieux, je suis preneur.

Code :
1
2
3
4
5
6
7
8
SELECT * FROM
([Requête]) T1, "BLUP_DLStats" T2, "BLUP_ClientFile" T3, "BLUP_File" T4
			WHERE T1."UserID" = T2."UserID"(+)
				  AND T1."ID" = T2."FileID"(+)
				  	  AND (T3."FileID" IS NULL OR T1."ID" = T3."FileID")
					  	  AND T2."ClientGuid" = T3."ClientGuid"(+)
						  	  AND T1."ID" = T4."ID"
An0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 10h51   #3
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
essaye comme ceci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
        ...
FROM
        (
            SELECT
                    ...
            FROM
                    T1
                    , T2
            WHERE
                    T1."UserID" = T2."UserID"(+)
            AND     T1."ID" = T2."FileID"(+)
        )   TT1
        , T3
        , T4
WHERE
                TT1."ID" = T3."FileID"(+)
	AND     TT1."ClientGuid" = T3."ClientGuid"(+)
	AND     TT1."ID" = T4."ID"
le but est de faire une pré-requête dans la clause FROM (on appelle ça une vue en ligne ou inline-view) qui contient la première jointure externe.
Ensuite ce résultat sera consédéré comme une seule table (TT1) que tu peux également joindre en externe avec T3...
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 10h56   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
la syntax left outer join est valide en 9i
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 11h26   #5
Nouveau Membre du Club
 
Développeur informatique
Inscription : novembre 2005
Messages : 44
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2005
Messages : 44
Points : 26
Points : 26
Envoyer un message via MSN à An0d
J'y avais aussi pensé Yorglaa, mais je me demandais si ce n'étais pas moins performant, car c'est refaire un select à chaque fois.
An0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 11h43   #6
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
non, non...
Oracle commence par la vue en-ligne (1x) PUIS s'appuie dessus pour le reste !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 12h29   #7
Nouveau Membre du Club
 
Développeur informatique
Inscription : novembre 2005
Messages : 44
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2005
Messages : 44
Points : 26
Points : 26
Envoyer un message via MSN à An0d
Ok, merci beaucoup
An0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h13.


 
 
 
 
Partenaires

Hébergement Web