2

我有,我想象的是标准的 SQL 设计模式。我有两个要加入的表。一个有一个日期,另一个有一个生效日期,我想要第二个表的最后一条记录,其生效日期小于或等于第一个表的日期。

我现在使用的查询类似于:

SELECT *
FROM Timecard 
LEFT JOIN Employee_Rate on Timecard.Employee=Employee_Rate.Employee
    AND Employee_Rate.Effective_Date =
    (
        SELECT MAX(Effective_Date)
        FROM Employee_Rate rate2
        WHERE Employee_Rate.Employee=rate2.Employee
            AND rate2.Effective_Date <=Timecard.Timecard_Date
    )

这工作得很好,我已经这样做了一段时间。但我想知道是否有更有效的方法来做到这一点。我正在尝试提高几个非常复杂的查询的性能。

我正在使用 SQL Server。

4

1 回答 1

1

我会推荐横向连接。这是一个强大的功能,似乎非常适合您的用例:

select t.*, er.*
from timecard
outer apply (
    select top (1) *
    from employee_rate er
    where er.employee = t.employee and er.effective_date <= t.timecard_date
    order by er.effective_date desc
) er

对于性能,请考虑在employee_rate(employee, effective_date).

于 2020-05-12T22:42:12.167 回答