首页 > 解决方案 > 左连接返回我想排除的附加数据

问题描述

我有 2 个如下表:

Employee: 

EmployeeId
EmployeeName
DeptId

Transactions:

TRID   
EmployeeId
Status(Pending,Done,InProgress,Rejected)

现在我想从EmployeeTable for DeptId = 100. 我想计算Pending那些交易的员工的状态pending

因此,如果在 Transactions 表中找到员工记录,那么只想返回一个列,说明员工是否有任何待处理的交易)

询问:

SELECT
        e.*,
        CASE WHEN (t.EmployeeId is not null and t.Status!= 'Done')
            THEN CAST(1 AS BIT) 
            ELSE CAST(0 AS BIT) 
        End as IsPendingTransaction,
    FROM 
        Employee e
        left join Transactions t on e.EmployeeId = t.EmployeeId
    where e.DeptId = 100

现在的问题是,有些员工在交易表中有多个交易,但对于这些员工,我只想考虑他们的最新交易并据此计算 IsPendingTransaction 状态。基本上order by Descending on TRID在从事务表中计算员工的 IsPendingTransaction 状态时。如果员工没有任何交易,那么 IsPendingTransaction 将为“假”。

谁能帮我解决这个问题?

标签: sqlsql-server

解决方案


使用outer apply

SELECT e.*,
       (CASE WHEN (t.EmployeeId is not null and t.Status <> 'Done')
             THEN CAST(1 AS BIT) 
             ELSE CAST(0 AS BIT) 
        End) as IsPendingTransaction
FROM Employee e OUTER APPLY
     (SELECT TOP (1) t.*
      FROM Transactions t 
      WHERE e.EmployeeId = t.EmployeeId
      ORDER BY t.trID DESC
     ) t
WHERE e.DeptId = 100;

推荐阅读