2017-07-02 74 views
-1

我有一个表EMP与列如下:小棘手查询加入

create table emp(
empno number(4,0), 
ename varchar2(10), 
job  varchar2(9), 
mgr_id number(4,0), 
sal  number(7,2), 
deptno number(2,0)); 

我想列出所有员工的名字与他们的经理的名字,包括那些没有谁的经理一起。对于这些员工,他们的经理姓名应该显示为'BOSS'。

+0

PL/SQL与甲骨文相关。我相应地更改了标签。这个问题根本没有任何棘手的地方。您应该学习SQL,以便您可以回答这些问题。 –

+0

如果你知道答案,请让我知道 –

+1

可能dup的https://stackoverflow.com/questions/3362038/what-is-self-join-and-when-would-you-use-it。 –

回答

2

下面的查询应该工作:

select e.ename, (case when m.ename is null then 'BOSS' else m.ename end) as mgrName 
from emp e 
left join emp m on m.empno = e.mgr_id 
2

在我看来,更好的解决办法是通过Charanjith建议。

在Oracle中,我们甚至可以使用NVL函数而不是“case when”来替换null值。结果应该是一样的。

select e.ename empName, NVL(m.ename, 'BOSS') mgrName from emp e 
left join emp m on m.empno = e.mgr_id 

此外,我们还可以看到另一种解决方案:使用内部连接到EMP过滤当一个管理者存在。然后结合所有没有任何经理的员工。

select e.ename empName, m.ename mgrName from emp e inner join emp m on e.mgr_id = m.empno 
union 
select e.ename empName, 'BOSS' mgrName from emp e where not exists (select 1 from emp m where e.mgr_id = m.empno) 
+0

我们可以使用像这样解码(m.ename,null,'BOSS',m.ename); –

+1

最好的情况是使用'COALESCE'而不是'CASE' /'NVL',这是标准SQL和CASE的快捷方式。 – dnoeth

0

在Oracle这项工作很好:

SELECT e.ename, 
nvl(m.ename, 'BOSS')mgr 
    FROM emp a 
LEFT JOIN emp b 
ON m.empno = e.mgr_id;