Sql 关于自连接的小技巧查询
我有一个表EMP,列如下:Sql 关于自连接的小技巧查询,sql,oracle,Sql,Oracle,我有一个表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, (
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
在我看来,更好的解决方案是由查兰基思提出的 在Oracle中,我们甚至可以使用NVL函数代替case-when,以便用某物替换空值。结果应该是一样的
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)
这项工作在oracle中很好:
SELECT e.ename,
nvl(m.ename, 'BOSS')mgr
FROM emp a
LEFT JOIN emp b
ON m.empno = e.mgr_id;
PL/SQL与Oracle相关联。我相应地更改了标签。这个问题一点也不棘手。你应该学习SQL,这样你才能回答这样的问题。如果你知道答案,请让我知道可能的重复。我们可以像这样使用解码m.ename,null,'BOSS',m.ename;最好的情况是使用COALESCE而不是case/NVL,后者是标准的SQL和case的快捷方式。