mysql - SQL 获取非规范化表中某指定信息对应的第一个字段

标签 mysql sql select inner-join

我有一个无法更改其结构的 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/

相关文章:

sql - 如何在H2中将时间转换为24小时格式

mysql - Date Format() 函数的问题

python - MySQL:从脚本导入 CSV 文件

mysql - 外键编辑

mysql - 如何从第二表和第三表中进行选择并根据交易日期对数据进行分组

c# - SharePoint 2013 App——增删改查操作

.net - 使用 ADO.NET 获取列默认值

javascript - AngularJS:重置功能重置表格但不清除输入字段并选择?

select - 改进 ProLog 中的 select/3

PHP while函数与mysql查询