Sql 如何让Oracle在具有左联接的一对多关系表中返回唯一结果
我有三张桌子 表1 表2Sql 如何让Oracle在具有左联接的一对多关系表中返回唯一结果,sql,oracle,Sql,Oracle,我有三张桌子 表1 表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 N
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
我需要表2和表3中的一个匹配项与表1中的相应项进行匹配执行
左连接
,以获得t2表中没有任何引用的t1行<代码>分组依据每个部门仅获取一行
select t1.id, t1.Department, min(t2.Name)
from t1
left join t2 on t1.id = t2.DepartId
group by t1.id, t1.Department
我想我应该使用一个相关的子查询:
select t1.*,
(select t2.name
from t2
where t1.id = t2.DepartId and rownum = 1
) as t2name
from t1;
这节省了聚合的开销。
t2(DepartId,name)
上的索引是此查询的最佳选择。顺便说一句,不是您特定问题的答案,而是如果您想要所有名称,您可以使用listag
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
@尼基尔。在别人回答了问题后再改是不礼貌的。你的新问题使人们付出努力的答案无效。无效的答案可能会吸引反对票。更好的做法是问另一个问题。很抱歉,我觉得最初的问题没有正确地解释我的问题。(在我看来)最好的办法是问另一个问题。重要的是要考虑改变问题是否会导致无效答案。
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