Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 关于自连接的小技巧查询_Sql_Oracle - Fatal编程技术网

Sql 关于自连接的小技巧查询

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, (

我有一个表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

在我看来,更好的解决方案是由查兰基思提出的

在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的快捷方式。