首页 > 解决方案 > 使用连接表的 SQL 连接未返回预期结果

问题描述

为了将用户映射到他们的经理,我在 SQL Server 中加入了 3 个表。联结表的目的是将他们的完整用户名映射到他们的网络 ID。这是查询:

select
    dbo.Employee_Records.EMPLOYEE_NAME as AD_NAME,
    dbo.Employee_Records.NAME as NAME,
    dbo.Employee_Records_MANAGER_S_.KEYWORD as SUPERVISOR_FULLNAME,
    dbo.employee_records.EMPLOYEE_NAME as SUPERVISOR_ADNAME
from
    dbo.Employee_Records
left outer join dbo.Employee_Records_MANAGER_S_ on
    dbo.Employee_Records.ID = dbo.Employee_Records_MANAGER_S_.ID
left join dbo.Employee_Records_MANAGER_S_ as ManagersList on
    ManagersList.KEYWORD = dbo.employee_records.name

前 3 列按我的预期出现,显示网络 ID、完整用户名和管理器的全名。但是,第 4 列是问题所在。它显示的是用户的网络 ID,而不是管理员。

它看起来像这样:

AD_NAME | NAME          | SUPERVISOR_FULLNAME | SUPERVISOR_ADNAME
USER1   | User, Test    | Supervisor, Test    | USER1
USER1   | User, Test    | Supervisor2, Test   | USER1

它应该如下所示:

AD_NAME | NAME          | SUPERVISOR_FULLNAME | SUPERVISOR_ADNAME
USER1   | User, Test    | Supervisor, Test    | SUPERVISOR1
USER1   | User, Test    | Supervisor2, Test   | SUPERVISOR2

Employee.Records表包含所有完整的用户名和完整的主管姓名。The Employee.Records_MANAGER_S_表用于将主管与用户联系起来,因为每个用户可以有多个主管。网络名称和全名的所有映射也都在Employee.Records表中,所以从技术上讲,我正在尝试将表加入到Employee.Records表中Employee_Records_MANAGER_S_,然后再次将Employee_Recors_MANAGER_S_后面加入到Employee.Records表中,但这次加入的是SUPERVISOR_FULLNAME而不是员工的名字。

标签: sqlsql-servertsqljoin

解决方案


如果我理解正确,您需要第二次加入您的dbo.Employee_Records餐桌以获取主管的详细信息。

select
    ER.EMPLOYEE_NAME as AD_NAME,
    ER.[NAME] as [NAME],
    M.KEYWORD as SUPERVISOR_FULLNAME,
    MR.EMPLOYEE_NAME as SUPERVISOR_ADNAME
from dbo.Employee_Records as ER
left outer join dbo.Employee_Records_MANAGER_S_ as M on ER.ID = S.ID
left join dbo.Employee_Records as MR on MR.[NAME] = M.KEYWORD;

注意:如图所示,我强烈推荐使用短表别名,因为它们使查询更加清晰。


推荐阅读