我有一个问题,就是在使用左联接(3分钟)时需要花费更多时间来获取数据。但是,当尝试进行内部联接时,只需要不到20秒的时间。由于内部联接消除了在相应表中没有数据的其他记录,因此我无法获取所有记录。请帮助解决此问题。
查询:
SELECT UserName, UserEmail, UserLeaveReason FROM [dbo].[UserData] UD WITH (NOLOCK)
INNER JOIN #vw_User REQ on UD.UserID= REQ.UserID
LEFT JOIN Txn_UserLeaveDetails TD ON TD.RELREQID = REQ.RELREQID AND TD.IsActive = 1
LEFT JOIN MST_LeaveDescription TS ON TS.LeaveDescriptionId = TD.LeaveDescriptionId
Txn_UserLeaveDetails:包含用户的休假详细信息,可以是活动的,也可以是非活动的(过去的叶子)。对于此查询,我只需要当前叶子的数据。
**Txn_UserLeaveDetails**
RELREQID
UserID
LeaveStartDate
LeaveEndDate
CreatedDate
CreatedBy
UpdatedDate
UpdatedBy
IsActive
MST_LeaveDescription:该表提供了请假原因的描述。
**MST_LeaveDescription**
LeaveDescriptionId
LeaveReason
CreatedDate
UpdateDate
在以上查询输出中,我需要所有用户数据,无论其休假状态如何。但是使用上面的查询需要3分钟。但是,当我将MST_LeaveDescription的联接更改为内部联接时,仅需20秒。但是在那种情况下,我会让用户休假。
请帮助
谢谢。
答案 0 :(得分:0)
create table #UserLeave
(
UserId int index idxUserId,
UserLeaveReason varchar(200)
)
--get active leaves
insert into #UserActiveLeave(UserId, UserLeaveReason)
select TD.UserID, TS.LeaveReason
from Txn_UserLeaveDetails TD
join MST_LeaveDescription TS on TD.LeaveDescriptionId = TS.LeaveDescriptionId
where TD.IsActive = 1;
--get the rest of the users without active leaves
insert into #UserActiveLeave(UserId)
select UserID
from [dbo].[UserData]
except
select UserId
from #UserActiveLeave;
--result
select ud.UserName, ud.UserEmail, ua.UserLeaveReason
from #UserActiveLeave as ua
join [dbo].[UserData] as ud on ua.UserId = ud.UserId;