【问题标题】:What is the best SQL effective dates design pattern什么是最好的 SQL 生效日期设计模式
【发布时间】:2020-08-28 23:18:38
【问题描述】:

我有,我想象的是标准的 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。

【问题讨论】:

标签: sql sql-server left-join greatest-n-per-group lateral-join


【解决方案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) 上建立索引。

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多