T-SQL

时间:2018-02-18 18:43:59

标签: sql-server tsql

我在基表中有一些数据相当于:

EmployeeID,Department,Role,Location
-----------------------------------
001,HR,Support,Bristol
002,Banking,Partner,Sheffield
etc.

然后我有另外三个表,当它适用于个人时,包含任何其他部门,角色或位置,但这些表只是填充了EmployeeID和其他信息,例如

EmployeeID,Location
-------------------
001,London

在填充的地方,我需要采取每个排列,例如,如果此人有一个额外的伦敦位置,如上所述,我希望生成两行:

001,HR,Support,Bristol
001,HR,Support,London

如果这个人还担任秘书,我会期待四行,但是:

001,HR,Support,Bristol
001,HR,Support,London
001,HR,Secretary,Bristol
001,HR,Secretary,London

为清楚起见,我希望看到基表中的任何记录在多表中也不匹配。从根本上说,在上面的例子中,我希望有五行:

001,HR,Support,Bristol
001,HR,Support,London
001,HR,Secretary,Bristol
001,HR,Secretary,London
002,Banking,Partner,Sheffield

希望这有点道理

提前致谢。

2 个答案:

答案 0 :(得分:1)

with departmentX as
(
select EmployeeID, Department from Employee
union
select EmployeeId, Department from Department
),
roleX as
(
select EmployeeID, Role from Employee
union
select EmployeeId, Role from Role
),
locationX as
(
select EmployeeID, Location from Employee
union
select EmployeeId, Location from Location
)
select d.EmployeeId, d.department, r.Role, l.Location
from
departmentX d join roleX r 
on d.EmployeeId = r.EMployeeId
join locationX l on d.employeeId = l.EmployeeId

答案 1 :(得分:1)

我想我有一个解决方案 - 你可以通过小步骤来实现:

1)找到员工的每个部门

SELECT EmployeeID, Department FROM dbo.additionalDepartments
UNION
SELECT EmployeeID, Department FROM dbo.baseTable

2)查找员工的每个角色

SELECT EmployeeID, Role FROM dbo.additionalRoles
UNION
SELECT EmployeeID, Role FROM dbo.baseTable

3)找到员工的每个地点

SELECT EmployeeID, Location FROM dbo.additionalLocations
UNION
SELECT EmployeeID, Location FROM dbo.baseTable

4)加入他们所有人:)

SELECT D.EmployeeID, D.Department, R.Role, L.Location FROM
(
    SELECT EmployeeID, Department FROM dbo.additionalDepartments
    UNION
    SELECT EmployeeID, Department FROM dbo.baseTable
) D
INNER JOIN 
(
    SELECT EmployeeID, Role FROM dbo.additionalRoles
    UNION
    SELECT EmployeeID, Role FROM dbo.baseTable
) R ON D.EmployeeID = R.EmployeeID
INNER JOIN
(
    SELECT EmployeeID, Location FROM dbo.additionalLocations
    UNION
    SELECT EmployeeID, Location FROM dbo.baseTable
) L ON D.EmployeeID = L.EmployeeID

请检查我的SQL小提琴。我已经在http://sqlfiddle.com/#!18/756fd/2/0

构建了您的方案