【发布时间】:2017-09-15 06:25:08
【问题描述】:
我会先说明这个问题与SQL Join on Nearest Less Than Date 类似,但那里的解决方案不适用于我的问题。我不需要选择单个列,而是需要基于最近日期“过滤”的表的结果。
我有三张桌子。主表包含时间票数据,格式为:
ticketId
ticketNumber
ticketDate
projectId
辅助表跟踪项目每张每日票的资源费率计划。它看起来像这样:
scheduleId
projectId
effectiveDate
还有一个与第二个相关的第三个表,其中实际包含适用的费率。像这样的:
scheduleId
straightTime
overTime
加入 projectId 上的前两个表(显然)会复制项目费率计划中每条记录的数据。如果我有项目 1 的 3 个费率表,则工单记录会产生如下结果:
ticketNumber | ticketDate | projectId | effectiveDate | scheduleId
------------- | ------------ | ----------- | -------------- | ----------
1234 | 2016-06-18 | 25 | 2016-06-01 | 1
1234 | 2016-06-18 | 25 | 2016-06-15 | 2
1234 | 2016-06-18 | 25 | 2016-06-31 | 3
在我的结果中选择有效日期很简单:
SELECT *
, (SELECT TOP 1 t1.effectiveFrom
FROM dbo.labourRateSchedule t1
WHERE t1.effectiveFrom <= t2.[date] and t1.projectId = t2.projectId
ORDER BY t1.effectiveFrom desc) as effectiveDate
FROM dbo.timeTicket t2
ORDER BY t.date
但是,我需要能够将 dbo.labourRateSchedule 的 ID 加入到第三个表中以获取适用的实际费率。将 t1.ID 添加到 SELECT 语句不会使其可访问以 JOIN 到另一个相关表中。
我一直在尝试在 FROM 语句中加入 SELECT 语句,但结果仅是最后一个有效日期值,而不是最接近适用的票证日期的值。
我将非常感谢任何帮助!
【问题讨论】:
-
要清楚一点,请提供表名而不是“第一,第二”,以便可以将查询与结构进行比较。
标签: sql sql-server database join sql-server-2016