Каков будет запрос для сотрудника, который работает для всего отдела? - PullRequest
0 голосов
/ 13 декабря 2018

Какой будет запрос для сотрудника, который работал на весь отдел.здесь у отдела и сотрудника есть много ко многим кардинальных чисел.

Таблицы:

CREATE TABLE employees
(
    employee_id int NOT NULL CONSTRAINT pk_employees PRIMARY KEY,
    employee_name nvarchar(128) NOT NULL CONSTRAINT uk_employees_employee_name UNIQUE
);

CREATE TABLE departments
(
    department_id int NOT NULL PRIMARY KEY,
    department_name nvarchar(128) NOT NULL CONSTRAINT uk_departments_department_name UNIQUE
);

CREATE TABLE department_employees
(
    department_id int NOT NULL CONSTRAINT fk_department_employees_departments REFERENCES departments(department_id),
    employee_id int NOT NULL CONSTRAINT fk_departement_employees_employees REFERENCES employees(employee_id),
    CONSTRAINT pk_deparment_employees PRIMARY KEY (department_id, employee_id)
)

Пример данных:

INSERT INTO employees
VALUES (1, 'John Doe'), (2, 'Jane Doe'), (3, 'William Doe'), (4, 'Margaret Doe')

INSERT INTO departments
VALUES (1, 'Accounting'), (2, 'Humman Resources'), (3, 'Marketing')

INSERT INTO department_employees
VALUES 
    (1, 1), (2, 1), (3, 1),
    (2, 2), (2, 3),
    (3, 3), (3, 4)

Ожидаемые результаты:

+-------------+---------------+
| employee_id | employee_name |
+-------------+---------------+
|           1 | John Doe      |
+-------------+---------------+

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Вы можете попробовать выполнить этот запрос ниже.

Здесь в переменной все отдельные единицы подсчета были взяты из основной таблицы отдела.После этого были выбраны только те сотрудники, для которых количество совпадает с отличным количеством связанных отделов в таблице отношений.

declare @distinctDeptCount int 
SET @DistinctDeptCount = (SELECT Count(Distinct department_id) FROM departments)
--SELECT @DistinctDeptCount

SELECT Distinct employees.employee_id, employee_name
from employees     
where employees.employee_id in (
select employee_id from department_employees GROUP BY employee_id HAVING COUNT(department_id) = @distinctDeptCount
)

ИЛИ

SELECT Distinct employees.employee_id, employee_name
from employees     
where employees.employee_id in (
select employee_id from department_employees GROUP BY employee_id HAVING COUNT(department_id) = 
(SELECT Count(Distinct department_id) FROM departments)
)

Выходные данные, как показано ниже

employee_id employee_name
1           John Doe

Вот живая демоверсия Emp.со всеми отделами

0 голосов
/ 13 декабря 2018

Вы можете попробовать это

SELECT
    emp.name
FROM 
    Employee emp 
JOIN 
    EmpDept empd 
ON 
    emp.EmployeeID = empd.EmpId 
GROUP BY
    emp.EmployeeID
HAVING 
    count(emp.EmployeeID) = (select count(1) from Department)
0 голосов
/ 13 декабря 2018

Эта операция называется Отдел отношений: для реляционной алгебры.

Она может быть реализована в SQL с помощью запроса, подобного следующему

SELECT *
FROM dbo.employees e
WHERE 
    NOT EXISTS (
        SELECT *
        FROM departments d
        WHERE d.department_id NOT IN (
            SELECT dp.department_id
            FROM department_employees dp
            WHERE dp.department_id = d.department_id AND dp.employee_id = e.employee_id
        )
    )

Обратите внимание, чтозапрос: «Дайте мне сотрудников, которые работают во всех отделах» эквивалентен «Дайте мне всех сотрудников, в которых нет отдела, в котором этот сотрудник не работает» *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...