5

以下は、私の 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スクリプトです:

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

マネージャーの名前も記載するにはどうすればよいですか? *正しい内部結合を行っていますか?*

4

10 に答える 10

14

クエリm.Enameに追加:SELECT

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;
于 2013-03-28T09:50:30.890 に答える
2

mgrとを使用して結合する必要があるクエリは近いですempid

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 を参照してください

マネージャーのいない行を含むすべての行を返したい場合は、次のように変更しますLEFT JOIN(たとえば、社長):

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

デモで SQL Fiddle を参照してください

サンプル データの社長はnullマネージャーを持たないため、マネージャーの値を返します。

于 2013-03-28T09:52:11.100 に答える
1

結合に間違ったON節がありますが、これは機能します:

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

列はmgr 列を参照しEmpIdます。

デモ

于 2013-03-28T09:50:46.077 に答える
1

いいえ、正しい結合は次のとおりです。

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

現在の従業員の ManagerID をマネージャーの EmployeeID と一致させる必要があります。マネージャーの ManagerID ではありません。

更新
Andrey Gordeev が指摘したように:結果で Manager の名前を取得するには、クエリに追加する
必要もあります。それ以外の場合は、managerID のみを取得します。m.EnameSELECT

于 2013-03-28T09:49:06.923 に答える
1
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 ;
于 2016-08-27T21:50:13.223 に答える
0
Select e.lastname as employee ,m.lastname as manager
  from employees e,employees m
 where e.managerid=m.employyid(+)
于 2015-08-26T08:08:22.417 に答える
0
select e.ename as Employee, m.ename as Manager
from emp e, emp m
where e.mgr = m.empno

すべてのレコードの結果を取得したい場合 (誰かに報告するかどうかに関係なく)、2 番目のテーブルの名前に (+) を追加します。

select e.ename as Employee, m.ename as Manager
from emp e, emp m
where e.mgr = m.empno(+)
于 2015-02-16T13:06:52.943 に答える
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;
于 2013-03-28T09:55:27.150 に答える