2009-10-15 5 views
1

Nous avions la requête suivante dans SQL Server:convertir requête de serveur SQL externe oracle joindre question

SELECT b.columnB, 
     b.displayed_name AS displayName, 
     c.type_cd, 
     c.type_desc, 
     b.month_desc AS month 
FROM table1 a, table2 b, table3 c 
WHERE b.region_code *= a.columnA 
     AND c.program_type_cd *= a.program_type_cd 

qui, dans l'oracle, se convertit à:

SELECT b.columnB, 
     b.displayed_name displayName, 
     c.type_cd, 
     c.type_desc, 
     b.month_desc month 
FROM table1 a, 
     table2 b, 
     table3 c 
WHERE b.columnB = a.columnA(+) 
     AND c.type_cd = a.type_cd(+) 

Mais lors de l'exécution de cette Oracle nous obtenons une erreur

"a table must be outer joined to at most one other table" 

quelle est la meilleure façon de résoudre ce problème et de garder la même logique que le serveur SQL?

Répondre

1

Essayez cette fois:

SELECT b.columnB, 
     b.displayed_name displayName, 
     c.type_cd, 
     c.type_desc, 
     b.month_desc month 
FROM table1 a 
     LEFT JOIN table2 b ON b.columnB = a.columnA 
     LEFT JOIN tablec c ON c.type_cd = a.type_cd 
+0

si * = et LEFT JOIN font la même chose, alors je vais aller à LEFT JOIN. C'est pourquoi je déteste les annotations dans la programmation aussi. merci – Omnipresent

+0

En fait, je ne pense pas que cela fasse la même chose que la requête originale: l'original était une jointure gauche de b à a, et simultanément de c à a, ce qui explique pourquoi Oracle s'est plaint. La requête réécrite est une jointure gauche de a à b et a à c, qui aurait été = * au lieu de * = dans la requête d'origine. –

+0

alors comment devrait-il être écrit en oracle? – Omnipresent

0

Pourquoi table1 répertorié comme un OUTER JOIN si vous ne retournez pas les données de celui-ci? Il semble que vous voudriez table1 être une jointure interne à table2, puis faites un OUTER entre 2 et 3. Comme ceci:

SELECT b.columnB, 
     b.displayed_name displayName, 
     c.type_cd, 
     c.type_desc, 
     b.month_desc month 
FROM table1 a, 
     table2 b, 
     table3 c 
WHERE b.columnB = a.columnA 
     AND c.type_cd = a.type_cd(+) 

Sur une autre note, je recommond passer à jointures ANSI (comme dans l'exemple d'Eric) - ils sont beaucoup plus faciles à lire, bien que fonctionnellement, ils sont la même chose et sont exécutés de la même manière.

+0

il est répertorié car la requête d'origine était longue et avait beaucoup plus de colonnes. Je l'ai raccourci pour cette question spécifique. – Omnipresent