我有一个表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'。
我有一个表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'。
下面的查询应该工作:
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
在我看来,更好的解决办法是通过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)
我们可以使用像这样解码(m.ename,null,'BOSS',m.ename); –
最好的情况是使用'COALESCE'而不是'CASE' /'NVL',这是标准SQL和CASE的快捷方式。 – dnoeth
在Oracle这项工作很好:
SELECT e.ename,
nvl(m.ename, 'BOSS')mgr
FROM emp a
LEFT JOIN emp b
ON m.empno = e.mgr_id;
PL/SQL与甲骨文相关。我相应地更改了标签。这个问题根本没有任何棘手的地方。您应该学习SQL,以便您可以回答这些问题。 –
如果你知道答案,请让我知道 –
可能dup的https://stackoverflow.com/questions/3362038/what-is-self-join-and-when-would-you-use-it。 –