Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 21/01/2011, 16h25   #1
Invité de passage
 
Inscription : mai 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 14
Points : 2
Points : 2
Par défaut Requete jointure externe

Bonjour,

J'ai un souci sur une requête et je galère, je n'arrive pas à trouver :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN 
FROM
 TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS, TD_DW_CONTRAT, TD_DW_PROV_SIN 
WHERE
 
 TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+) 
AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
AND NOT
TD_DW_PROV_SIN.ID_UNQ_SIN =
TD_DW_SINISTRE.ID_UNQ_SIN (+)
j'ai comme message erreur ORA-01417: une table peut être de jointure externe pour une autre table au moins.
sophie2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 16h39   #2
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Citation:
Envoyé par sophie2010 Voir le message
Bonjour,

J'ai un souci sur une requete et je galère, je n'arrive pas à trouver :

SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN
FROM
TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS, TD_DW_CONTRAT, TD_DW_PROV_SIN
WHERE

TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+)
AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
AND NOT
TD_DW_PROV_SIN.ID_UNQ_SIN =
TD_DW_SINISTRE.ID_UNQ_SIN (+)


j'ai comme message erreur ORA-01417: une table peut être de jointure externe pour une autre table au moins.
Bonjour,

tu as mis deux fois la même table est jointure externe et oracle le refuse.
__________________
==========================================
La justice sans la force est impuissante, la force sans la justice est tyrannique...
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 21h14   #3
Invité de passage
 
Inscription : mai 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 14
Points : 2
Points : 2
Oui j'ai bien compris que c'était ca le problème. Mais je ne sais pas comment formuler ma requête de façon à avoir la jointure de ces tables :

Code :
1
2
3
4
TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+) 
AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
et la négation de ces jointures :

Code :
1
2
TD_DW_PROV_SIN.ID_UNQ_SIN =
TD_DW_SINISTRE.ID_UNQ_SIN (+)
PS : je débute en sql.
sophie2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 22h34   #4
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Bonsoir,

sans connaitre le fonctionnel, c'est difficile de t'aider, peux-tu nous décrire ce que tu veux?

Essai d'enlever la partie qui te dérange en faisant une sous requête dans la clause from.

par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, 
TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, 
TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, 
TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, 
TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, 
TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, 
TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, 
TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, 
TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, 
TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, 
TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN 
FROM
TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS,
 TD_DW_CONTRAT, TD_DW_PROV_SIN, 
(select xxx from tes_tables where ...) tmp
WHERE
__________________
==========================================
La justice sans la force est impuissante, la force sans la justice est tyrannique...
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 22h51   #5
Invité de passage
 
Inscription : mai 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 14
Points : 2
Points : 2
en fait, ce que je veux c'est ne pas récupérer les id_unq_sin déja présent dans la table TD_DW_PROV_SIN suite à une jointure externe faite dans un premier temps :
Code :
1
2
TD_DW_PROV_SIN.ID_UNQ_SIN =
TD_DW_SINISTRE.ID_UNQ_SIN (+)
Si je fais cela, est ce que ca pourrait marcher :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN 
FROM
TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS, TD_DW_CONTRAT, TD_DW_PROV_SIN 
WHERE

TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+) 
AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
AND NOT EXISTS (
SELECT * FROM TD_DW_SINISTRE, TD_DW_PROV_SIN where TD_DW_PROV_SIN.ID_UNQ_SIN =
TD_DW_SINISTRE.ID_UNQ_SIN  )
sophie2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 22h53   #6
Invité de passage
 
Inscription : mai 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 14
Points : 2
Points : 2
Merci pour votre aide
sophie2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 09h18   #7
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Bonjour,

il faudrait voir du côté de l'utilisation de union ou minus suivant votre cas.
__________________
==========================================
La justice sans la force est impuissante, la force sans la justice est tyrannique...
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 14h59   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il faut commencer par laisser tomber les (+) surtout, et utiliser des alias de table.
Effectivement NOT EXISTS est une bonne solution :
Code :
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
SELECT tsn.SOURCE,
       tsn.ID_CTRTE,
       tsn.ID_PROD,
       tsn.ID_OPT,
       tsn.ID_SOC,
       tsn.ID_INTERV_DISTRIB,
       tsn.ID_STRUCT,
       tsn.TYP_SIN,
       tsn.DT_PASS_POS_SIN,
       tsn.ID_UNQ_ROL_ASS,
       tsn.ID_UNQ_CONT,
       tsn.TYP_ENREG,
       tra.ID_UNQ_GEN_PROD,
       tgp.ID_GEN_PROD,
       tpe.SOURCE,
       tpe.TYP_ENREG,
       tpe.NUM_LOT_DE,
       tco.ID_UNQ_INTERV,
       tsn.PROV_SIN_PROB,
       tpe.ID_UNQ_PEC,
       tpe.NUM_DEC,
       tpe.ID_UNQ_SIN,
       tco.DT_SIGN_CONT
  FROM TD_DW_PEC tpe
       LEFT OUTER JOIN TD_DW_SINISTRE tsn
         ON tsn.ID_UNQ_SIN = tpe.ID_UNQ_SIN
       LEFT OUTER JOIN TD_DW_CONTRAT tco
         ON tco.ID_UNQ_CONT = tsn.ID_UNQ_CONT
       LEFT OUTER JOIN TD_DW_ROL_ASS tra
         ON tra.ID_UNQ_ROL_ASS = tsn.ID_UNQ_ROL_ASS
       LEFT OUTER JOIN TD_DW_GEN_PRODUIT tgp
         ON tgp.ID_UNQ_GEN_PROD = tra.ID_UNQ_GEN_PROD
 WHERE NOT EXISTS (SELECT NULL 
                     FROM TD_DW_PROV_SIN tps 
                    WHERE tps.ID_UNQ_SIN = tsn.ID_UNQ_SIN);
__________________
Email : http://scr.im/waldar
Waldar 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 02h25.


 
 
 
 
Partenaires

Hébergement Web