首页 > 解决方案 > 临时表和历史表之间的左连接给出了相乘的结果

问题描述

我有一个存储过程,它检索所有员工的角色,称为GetAllRoles. 我将从此存储过程生成的数据插入到一个临时表中,如下所示:

创建临时表 #RoleTemp :

 CREATE TABLE #RoleTemp (

              EmployeeId INT ,
              EmployeeRoleId  int,
              EntityRoleId int, 
              ValueId int , 
              [RoleLabel] VARCHAR(255), 
              SecurityIdentifier VARCHAR(250) , 
              [Role] NVARCHAR(MAX), 
              RoleAccess  VARCHAR(255)
)

填充#RoleTemp 表:

INSERT INTO #RoleTemp 
EXEC GetAllEmployeeRoles

我想加入 #RoleTemp 和 Employee_RoleHistory 表,如下所示:

SELECT rt.EmployeeId,erh.RoleId,erh.CreatedDate AS StartDate,erh.RemovedDate AS EndDate FROM #RoleTemp rt
LEFT JOIN Employee_RoleHistory erh ON rt.EntityRoleId=erh.RoleId
WHERE rt.EmployeeId=5625

而不是为每个角色获取 StartDate 和 EndDate :

EmployeeId  RoleId  StartDate                           EndDate 
5625        23      2016-07-12 11:12:33.4900000 6973    2019-01-07 10:29:25.3900000     
5625        25      2019-07-12 11:12:33.4900000 6973    NULL    
5625        233     2018-09-23 11:12:33.4900000 6973    NULL    
...         ...     ...                                 ...

我得到每个角色重复多次的结果,如下所示:

EmployeeId  RoleId  StartDate                           EndDate 
5625        23      2016-07-12 11:12:33.4900000 6973    NULL        
5625        23      2016-07-12 11:12:33.4900000 6973    NULL    
5625        23      2016-07-12 11:12:33.4900000 6973    NULL    
...         ...     ...                                 ...

标签: sql-servertsql

解决方案


尝试了解表关系与重复的真正原因,并通过添加适当的ON条件来纠正它。

如果没有任何效果,那就去吧DISTINCT

使用DISTINCT条款

SELECT DISTINCT rt.EmployeeId, erh.RoleId, erh.CreatedDate AS StartDate,erh.RemovedDate AS EndDate 
FROM #RoleTemp rt LEFT JOIN Employee_RoleHistory erh ON rt.EntityRoleId=erh.RoleId
WHERE rt.EmployeeId = 5625

推荐阅读