我有一个无法更改其结构的 SQL 表。
Employee_Team 表有 5 列:TeamID、Employee1、Employee2、Employee3 和 Employee4。 Employee1、Employee2、Employee3 和 Employee4 列的字段包含一个 EmployeeID。每个员工 ID 在员工表中都有一个城市。 Employee_Team 的同一行中可能有多名员工住在同一个城镇。总会有至少 1 名员工住在我要寻找的城镇。
example http://www.atriasoft.com/table.png
示例:
我想要第一个住在纽约的员工。对于 TeamID 01,它将是 Employee2(我不想要 Employee 4,即使他的城市是纽约),对于 TeamID 02,它将是 Employee1(我仍然不想要第二个员工住在纽约)。
我目前有一个代码,可以为我提供居住在纽约的每一位员工:
SELECT *
FROM Employee_Team
INNER JOIN Employees
ON Employees.EmployeeID = Employee_Team.Employee1 OR
Employees.EmployeeID = Employee_Team.Employee2 OR
Employees.EmployeeID = Employee_Team.Employee3 OR
Employees.EmployeeID = Employee_Team.Employee4
WHERE Employees.City = ‘New York’
我正在寻找的是一个代码,它只需要居住在纽约的第一位员工。 任何提示将不胜感激!
最佳答案
实际上,您可以通过将表用作 View 的基础来安全地“更改”表的定义:
CREATE VIEW NormalTeams (TeamID, EmployeeID, TeamMemberNumber) AS
SELECT TeamID, Employee1, 1 FROM Employee_TEAM UNION ALL
SELECT TeamID, Employee2, 2 FROM Employee_TEAM UNION ALL
SELECT TeamID, Employee3, 3 FROM Employee_TEAM UNION ALL
SELECT TeamID, Employee4, 4 FROM Employee_TEAM
现在,NormalTeams 将允许您以您期望的方式选择数据:
SELECT TeamID, MIN(TeamMemberNumber)
FROM NormalTeams T INNER JOIN Employees E ON T.EmployeeiD = E.EmployeeID
WHERE E.City = 'New York'
GROUP BY TeamID
将为您提供纽约的第一个团队成员“编号”。
SELECT TeamID, City, MIN(TeamMemberNumber)
FROM NormalTeams T INNER JOIN Employees E ON T.EmployeeiD = E.EmployeeID
GROUP BY TeamID, City
将为每个城市/团队组合提供更通用的解决方案。
您可以将这些结果连接回 NormalTeams 以获取员工 ID。
关于mysql - SQL 获取非规范化表中某指定信息对应的第一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8290743/