Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何让Oracle在具有左联接的一对多关系表中返回唯一结果_Sql_Oracle - Fatal编程技术网

Sql 如何让Oracle在具有左联接的一对多关系表中返回唯一结果

Sql 如何让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

我有三张桌子 表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  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