我有一個表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。 –