Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为所有部门工作的员工的查询是什么?_Sql Server_Database - Fatal编程技术网

Sql server 为所有部门工作的员工的查询是什么?

Sql server 为所有部门工作的员工的查询是什么?,sql-server,database,Sql Server,Database,对为所有部门工作的员工的查询是什么。在这里,部门和员工具有多对多的重要性 各表如下: 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 (

对为所有部门工作的员工的查询是什么。在这里,部门和员工具有多对多的重要性

各表如下:

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      |
+-------------+---------------+
此操作在关系代数上称为

它可以通过如下查询在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
        )
    )

请注意,查询:“给我所有部门工作的员工”等同于给我所有员工,即没有员工不为其工作的部门。

您可以尝试下面的查询

在变量中,所有不同的部门都是从部门主表中提取的。之后,仅选择了计数与关系表中的不同链接部门计数匹配的员工

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
)

输出如下所示

employee_id employee_name
1           John Doe
这是现场演示

您可以试试这个

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)

您需要提供所有相关表的模式和预期输出,以及示例数据和您尝试过的内容。。。EmployeeEmployeeID,Name DepartmentDeptId,Name EmpDeptId,EmpId,deptid尝试从中选择此名称。Name,counta.EmployeeID countEmp从员工a加入a.EmployeeID=b.EmpId组a.Name拥有counta.EmployeeID=从部门tmp选择count*
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)