2017-07-02 76 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;