Как объединить несколько столов, чтобы получить имена сотрудников, которые зарабатывают больше, чем их менеджер? - PullRequest
0 голосов
/ 02 августа 2020

Я создал две таблицы:

create table DEPARTMENTS 
( 
    dept_id  number,  
    dept     varchar2(50) not null, 
    mgr_id   number,
    location varchar2(50),  

    constraint pk_departments primary key (dept_id)  
);

create table EMPLOYEES 
(  
    emp_id         number,  
    fname          varchar2(50) not null,
    lname          varchar2(50) not null,  
    email          varchar2(50),
    phone          number,
    hired          date,
    job_id         varchar(20),
    salary         number(7,2),  
    commission_pct number(4,2),  
    dept_id        number,  
    grade          number,

    constraint pk_employees primary key (emp_id),  
    constraint fk_employees_dept_id foreign key (dept_id) 
        references DEPARTMENTS (dept_id)  
    constraint fk_employees_grade foreign key (grade) 
        references SALGRADE (grade)  
);

Как go Я получаю имена сотрудников, которые зарабатывают больше, чем их менеджеры, учитывая, что mgr_id находится в таблицах отделов, а сотрудник - в таблице сотрудников, и они связаны по dept_id?

Я обнаружил, что необходимо «самостоятельное присоединение». Но этот случай немного сложен, поскольку ссылка на dept_id необходима для ссылки на mgr_id, затем сравнения его с emp_id и создания соединения?

Ответы [ 3 ]

1 голос
/ 02 августа 2020

Для большей ясности и понимания себя используйте соединения ANSI:

SELECT * FROM 
    (SELECT E.SALARY AS MANAGER_SALARY, D.DEPT_ID AS DEPT_ID 
    FROM EMPLOYEES E 
    INNER JOIN 
    DEPARTMENTS D
    ON E.DEPT_ID = D.DEPT_ID) 
MGR_DET 
INNER JOIN 
EMPLOYEES EMP
ON MGR_DET.DEPT_ID = EMP.DEPT_ID 
where EMP.SALARY > MGR_DET.MANAGER_SALARY;
1 голос
/ 02 августа 2020

Вы можете сделать это с помощью трех объединений. Начните с таблицы employees, сравните с departments, чтобы получить менеджера. А затем вернитесь к employees с помощью менеджера.

Это выглядит так:

select e.*, em.salary   -- or whatever columns you want
from employees e join
     departments d
     on d.dept_id = e.dept_id join
     employees em
     on em.emp_id = d.mgr_id
where e.salary > em.salary
0 голосов
/ 02 августа 2020

Ответ с неявным объединением:

SELECT E1.* FROM EMPLOYEES E1, DEPARTMENT D, EMPLOYEES E2
WHERE E1.DEPT_ID = D.DEPT_ID AND D.DEPT_ID = E2.DEPT_ID AND D.MGR_ID = E2.MGR_ID
AND E1.SALARY >= E2.SALARY;

Здесь служащий E1 - это служащий, чья зарплата больше, чем у его руководителя отдела. Чтобы найти это, мы соединяем таблицу сотрудников E1 и таблицу отделов D, чтобы попасть на dept_id, а затем получаем mgr_id. Теперь следующий шаг - найти сотрудника с тем же идентификатором, что и mgr_id отдела. Следовательно, мы снова объединяем его с таблицей другого сотрудника E2 на emp_id. Наконец, мы сравниваем зарплату сотрудника e1 и менеджера (сотрудника e2).

Ответ с явным объединением:

SELECT E1.* FROM EMPLOYEES E1 JOIN DEPARTMENT D ON E1.DEPT_ID = D.DEPT_ID
JOIN EMPLOYEES E2 ON (D.DEPT_ID = E2.DEPT_ID AND D.MGR_ID = E2.MGR_ID)
WHERE E1.SALARY >= E2.SALARY;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...