2016-07-07 52 views
1

我有三個表 表1如何讓甲骨文在一對多的關係表的左返回唯一結果加入

Id Department 
1 A 
2 B 
3 C 
4 D 

表2

Id DepartId Name 
1 1   ABC 
2 1   DEF 
3 1   ASD 
4 2   FGH 
5 2   HJK 
6 3   ZXC 

表3

Id Depart Area 
1 A  pp 
2 B  
3 C  nn 
4 D  oo 

我需要結果

Id Depart Name Area 
1 A  ABC  pp 
2 B  FGH  Null 
3 C  ZXC  nn 
4 D  NULL oo 

我需要在表1

+1

@Nikil名稱。 。 。在人們回答問題後改變問題是無禮的。你的新問題使答案無效 - 人們付出努力。無效的答案可以吸引downvotes。更好的行動方式是提出另一個問題。 –

+0

對不起,我覺得初始問題沒有正確解釋我的查詢 –

+0

。 。 (我認爲)最好的做法是提出另一個問題。要考慮的重要問題是,更改問題是否會導致答案失效。 –

回答

1

從表2和表3一個匹配條目對應的條目做一個left join也得到T1行,而不在T2表中的任何引用。 GROUP BY每個部門只能獲得1行。

select t1.id, t1.Department, min(t2.Name) 
from t1 
    left join t2 on t1.id = t2.DepartId 
group by t1.id, t1.Department 
+0

做了一些更改 –

0

我想我會用一個相關子查詢做到這一點:

select t1.*, 
     (select t2.name 
     from t2 
     where t1.id = t2.DepartId and rownum = 1 
     ) as t2name 
from t1; 

這節省了聚合的開銷。 t2(DepartId, name)上的索引對於此查詢是最佳的。

+0

做了一些更改 –

0

由沒有辦法回答你的具體問題,但如果不是的只是一個你想你可以使用LISTAGG

SELECT t1.id, 
     department, 
     LISTAGG (name, ',') WITHIN GROUP (ORDER BY name) names 
    FROM t1, t2 
    WHERE t1.id = t2.departId(+) 
GROUP BY t1.id, department 
ORDER BY 1 

ID Department   Names 
1  A     ABC,ASD,DEF 
2  B     FGH, HJK 
3  C     ZXC 
4  D 
+0

做了一些更改 –