2013-03-28 27 views
4

以下是我的CREATE TABLE腳本:列表使用內部所有員工的名字和他們的經理由經理名參加

create table EMPLOYEES 
    (EmpID char(4)   unique Not null, 
    Ename varchar(10), 
    Job  varchar(9), 
    MGR  char(4), 
    Hiredate date, 
    Salary decimal(7,2), 
    Comm  decimal(7,2), 
    DeptNo char(2)   not null, 
     Primary key(EmpID), 
     Foreign key(DeptNo) REFERENCES DEPARTMENTS(DeptNo)); 

以下是我的INSERT腳本:

insert into EMPLOYEES values (7839,'King','President',null,'17-Nov-11',5000,null,10); 
insert into EMPLOYEES values (7698,'Blake','Manager',7839,'01-May-11',2850,null,30); 
insert into EMPLOYEES values (7782,'Clark','Manager',7839,'02-Jun-11',2450,null,10); 
insert into EMPLOYEES values (7566,'Jones','Manager',7839,'02-Apr-11',2975,null,20); 
insert into EMPLOYEES values (7654,'Martin','Salesman',7698,'28-Feb-12',1250,1400,30); 
insert into EMPLOYEES values (7499,'Allen','Salesman',7698,'20-Feb-11',1600,300,30); 
insert into EMPLOYEES values (7844,'Turner','Salesman',7698,'08-Sep-11',1500,0,30); 
insert into EMPLOYEES values (7900,'James','Clerk',7698,'22-Feb-12',950,null,30); 
insert into EMPLOYEES values (7521,'Ward','Salesman',7698,'22-Feb-12',1250,500,30); 
insert into EMPLOYEES values (7902,'Ford','Analyst',7566,'03-Dec-11',3000,null,20); 
insert into EMPLOYEES values (7369,'Smith','Clerk',7902,'17-Dec-10',800,null,20); 
insert into EMPLOYEES values (7788,'Scott','Analyst',7566,'09-Dec-12',3000,null,20); 
insert into EMPLOYEES values (7876,'Adams','Clerk',7788,'12-Jan-10',1100,null,20); 
insert into EMPLOYEES values (7934,'Miller','Clerk',7782,'23-Jan-12',1300,null,10); 

以下是我的選擇腳本:

select distinct e.Ename as Employee, m.mgr as reports_to 
from EMPLOYEES e 
inner join Employees m on e.mgr = m.mgr; 

我得到僱員與他們相應的經理的ID;

Ford 7566 
Scott 7566 
Allen 7698 
James 7698 
Martin 7698 
Turner 7698 
Ward 7698 
Miller 7782 
Adams 7788 
Blake 7839 
Clark 7839 
Jones 7839 
Smith 7902 

如何列出經理姓名? *我做了正確的內部連接*

回答

12

添加m.EnameSELECT查詢:

select distinct e.Ename as Employee, m.mgr as reports_to, m.Ename as Manager 
from EMPLOYEES e 
inner join Employees m on e.mgr = m.EmpID; 
+0

謝謝,這是我寫的最後一個腳本。過去5個小時我一直在糾正SQL腳本。我現在可以去睡覺了。我迷惑自己,因爲我的大腦需要休息。我會upvote你,但我沒有15聲望呢。我可以接受你的答案。很有幫助! :) – 2013-03-28 10:03:08

+0

@JeffOrris很高興幫助。祝你有一個美好的夜晚 – 2013-03-28 10:04:00

1

不,正確的連接是:

inner join Employees m on e.mgr = m.EmpID; 

您需要相匹配的經理ID與經理的僱員目前的員工。不是經理的ManagerID。

更新
正如安德烈Gordeev指出:
你想也需要添加m.EnameSELECT查詢以獲得經理的姓名與您的結果。否則,你只會得到managerID。

1

您的加入有一個不正確的ON條款,這個工程:

inner join Employees m on e.mgr = m.EmpId; 

mgr列引用EmpId列。

DEMO

2

您所查詢的是靠近你需要使用mgrempid

on e1.mgr = e2.empid 

的加入,使完整的查詢是:

select e1.ename Emp, 
    e2.eName Mgr 
from employees e1 
inner join employees e2 
    on e1.mgr = e2.empid 

SQL Fiddle with Demo

如果你想回來包括那些沒有經理,那麼你將其更改爲LEFT JOIN(例如總統)的所有行:

select e1.ename Emp, 
    e2.eName Mgr 
from employees e1 
left join employees e2 
    on e1.mgr = e2.empid 

SQL Fiddle with Demo

總統在您的樣本數據將返回null值經理,因爲他們沒有經理。

0
SELECT DISTINCT e.Ename AS Employee, 
    m.mgr AS reports_to, 
    m.Ename AS manager 
FROM Employees e, Employees m 
WHERE e.mgr=m.EmpID; 
0
select e.ename as Employee, m.ename as Manager 
from emp e, emp m 
where e.mgr = m.empno 

如果你想獲得的所有記錄的結果(無論他們是否向任何人報告與否),追加(+)在第二個表的名稱

select e.ename as Employee, m.ename as Manager 
from emp e, emp m 
where e.mgr = m.empno(+) 
0
Select e.lastname as employee ,m.lastname as manager 
    from employees e,employees m 
where e.managerid=m.employyid(+) 
+0

隨着那位經理和沒有經理的所有員工 – 2015-08-26 08:08:59

0
select a.empno,a.ename,a.job,a.mgr,B.empno,B.ename as MGR_name, B.job as MGR_JOB from 
    emp a, emp B where a.mgr=B.empno ; 
+0

您可能想告訴傑夫如何以及爲什麼會這樣工作,而不僅僅是發佈明碼。 – 2016-08-27 22:30:03

0

有三個表格 - 股票(庫侖:ID,ISIN)和債券(庫侖:ID,ISIN)。第三張證券(庫侖:ID,ISIN)包含來自股票和債券表的所有數據。 編寫SQL查詢以進行以下驗證: (1)證券表應包含來自股票和債券表的所有數據。 (2)證券表不應包含股票和債券表格以外的任何數據

+1

請嘗試格式化您的答案,提供一個示例和更多上下文,真的很難理解您的意思,以及它是否是PO問題的答案。 [我如何寫出一個好的答案?](https://stackoverflow.com/help/how-to-answer) – rmjoia 2017-10-13 10:24:17

相關問題