2010-07-14 5 views
0

Je dispose de 3 tables. J'utilise Oracle 10g.Aide à la requête SQL avec les jointures externes

Je suis en train d'obtenir des documents du tableau A, où les lignes n'existent pas dans le tableau C ET s'il y a une ligne correspondante dans le tableau C alors il devrait se réunir condition où C_PRIAMRY = 1.

Table_A 

A_ID, A_NAME, A_STATUS_CD, A_STATUS_DTE 
---------------------------------------- 
1  test1  NM   
2  test2  BB 
3  test3  CC 

Table_B 

B_ID  B_START_DATETIME  B_END_DATETIME 
-------------------------------------------- 
10   07-10-2010   08-10-2010 
20   07-10-2010   08-10-2010 


Table_C 

C_ID A_ID B_ID  C_PRIMARY 
------------------------------------- 
1  1  10   1 
2  1  10   0 
3  1  10   0 



select A.A_ID, A.A_NAME, A.A_STATUS_CD, A.A_STATUS_DTE, B.B_ID, B.B_START_DATETIME, C.C_PRIMARY 
    FROM TableA A, TableB B, TABLEC C 
WHERE A.A_ID = C.A_ID (+) AND C.B_ID = B.B_ID(+) AND C.PRIMARY(+) = 1   

J'ai écrit cette requête, cela ne fonctionne pas. S'il vous plaît suggérer des idées.

Merci

+0

Yikes ne la syntaxe LEFT JOIN pas travailler dans Oracle? – Jeremy

Répondre

3

Pensez à la réécriture de (+):

select * from A, B where A.ID = B.A_ID(+) 

l'équivalent, plus lisible left join:

select * from A left join B on A.ID = B.A_ID 

Appliqué à votre requête, je reçois:

select * 
from TableA A 
left join 
     TableC C 
on  c.a_id = a.a_id 
     and C.PRIMARY = 1 
left join 
     TableB B 
on  b.b_id = c.b_id 

Cela devrait récupérer toutes les lignes de A, appariés avec des lignes de C où primary = 1, jumelés à des lignes d'B.

Pour exclure les lignes du résultat quand aucune correspondance est trouvée, utilisez un inner join. Par exemple, pour trouver des lignes en A, pour laquelle une rangée correspondante en C existe avec primary = 1, mais pas de lignes correspondantes B:

select * 
from TableA A 
inner join 
     TableC C 
on  C.A_ID = A.A_ID 
     and C.C_PRIMARY = 1 
where not exists 
     (
     select * 
     from TableB B 
     where C.B_ID = B.B_ID 
     ) 
+0

Andomar, S'il n'y a pas de ligne dans le tableau B, il n'y aura pas non plus de ligne dans le TABLEAU C. – nav100

3

Essayez ceci:

SELECT A.A_ID, A.A_NAME, a.A_STATUS_CD, A.A_STATUS_DTE, 
    B.B_ID, B.B_START_DATETIME, C.C_PRIMARY 
FROM TableA A LEFT JOIN TableC C ON A.A_ID = C.A_ID 
    LEFT JOIN TAbleB B ON B.B_ID = C.B_ID 
WHERE C.A_ID IS NULL OR C.PRIMARY = 1 
+0

+1 même que ma réponse. –

+0

+1 Je pense que vous avez mieux compris l'OP que moi :) – Andomar