SQL查询以在表中显示名称和部门

时间:2018-11-01 19:40:07

标签: sql

能帮我吗,我不知道如何创建此查询。我是前端开发人员。

预期结果应为2列的表格

名称(一个)DepartmentName(许多)

表及其关系如下图所示:

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以使用几个INNER JOINS来完成此操作。您无需在此查询中引用Location表,因为Employee.LocationIdEmployeeDepartment.LocationId相同。

此简单查询将返回所有员工姓名和与之相关的所有部门名称。员工名称可能会重复,因为此查询仅在列中输入一个部门名称,因此,如果一个员工在两个部门中,则两次获得该员工名称。

SELECT 
    EmployeeName = e.Name
    ,DepartmentName = d.Name 
FROM Employee e
INNER JOIN EmployeeDepartment ed ON ed.LocationId = e.LocationId
INNER JOIN Department d ON d.id = ed.DepartmentId

此查询稍微复杂一点,但每个员工姓名仅返回一次,部门名称将是一个用逗号分隔的名称字符串。这可以通过结合使用STUFF()FOR XML来实现。

;WITH EmployeesAndDepartments AS
(
    SELECT
        EmployeeName = e.Name
        ,DepartmentName = d.Name
    FROM Employee e
    INNER JOIN EmployeeDepartment ed ON ed.LocationId = e.LocationId
    INNER JOIN Department d ON d.id = ed.DepartmentId
)
SELECT
    ead.EmployeeName
    ,Departments = STUFF((
                             SELECT ',' + DepartmentName
                             FROM EmployeesAndDepartments
                             FOR XML PATH('')
                         ) , 1, 1, ''
                   )
FROM EmployeesAndDepartments ead
GROUP BY ead.EmployeeName

答案 1 :(得分:0)

这应该有效

SELECT
      e.Name
    , d.Name AS DepartmentName

FROM
    Employee e

LEFT OUTER JOIN
    EmployeeDepartment ed
    ON e.LocationId = ed.LocationId

LEFT OUTER JOIN
    Department d
    ON ed.DepartmentId = d.id

请注意,即使他们在EmployeeDeparatment和/或Department中没有相应的记录,使用LEFT OUTER JOIN也会返回该雇员。如果您只想检索具有相应的EmployeeDepartment和Department记录的员工,请改用INNER JOIN