在多个联接中使用SQL子查询的结果

在多个联接中使用SQL子查询的结果,sql,sql-server,Sql,Sql Server,我有一个子查询:- SELECT TOP 1 Months.EndDate FROM (SELECT TOP 1 * FROM FinancialMonth WHERE FinancialMonth.EndDate > DATEADD(MONTH, -12, GETDATE()) AND FinancialMonth.StartDate < GETDATE() ORDER BY Period ASC) Months ORDER BY M

我有一个子查询:-

SELECT TOP 1 Months.EndDate
FROM (SELECT TOP 1 *
      FROM FinancialMonth
      WHERE FinancialMonth.EndDate > DATEADD(MONTH, -12, GETDATE())
      AND FinancialMonth.StartDate < GETDATE()
      ORDER BY Period ASC) Months
ORDER BY Months.Period DESC

这将返回月末日期,只需更改第二个前1名,即可适用于去年任何月份之前的日期

我的问题是,我需要在许多左JOIN语句中使用这个日期,并将其与两个表进行比较。我还需要在最终的SELECT SUM语句中返回它

通过手动输入左连接查询的日期,我可以运行主查询,并在1秒内返回结果。然而,如果我将此子查询放在每个左连接上,运行它可能需要一分钟以上的时间。考虑到我希望在过去12个月中的每一个月都运行此查询,这将占用服务器一段不可接受的时间


是否有任何方法可以运行查询,然后在左联接子查询中引用此结果,而不必反复运行查询。目前,它的运行次数似乎超过了10万次。

我已经不明白为什么要使用2 x top 1 a top 1 in top 1给定1行,您的查询可以简化为:

  SELECT TOP 1 EndDate
  FROM FinancialMonth
  WHERE FinancialMonth.EndDate > DATEADD(MONTH, -12, GETDATE())
  AND FinancialMonth.StartDate < GETDATE()
  ORDER BY Period ASC
现在,您可以做如下操作:

with TblEndDate as (
SELECT TOP 1 EndDate
FROM FinancialMonth
WHERE FinancialMonth.EndDate > DATEADD(MONTH, -12, GETDATE())
AND FinancialMonth.StartDate < GETDATE()
ORDER BY Period ASC
)
select * from othertable f1 
left outer join TblEndDate  f2 on f1.DateInOthertable>=f2.EndDate

查看常见的表表达式CTE的示例数据、所需的结果以及对您想要实现的逻辑的解释,这将非常有帮助。我不知道您是否希望返回特定月份的一行,不同月份的12行,或者其他什么。表的结构也不清楚。简单地更改第二个前1,如果您解释如何更改它,那么我们就不必猜测,那么日期真的是一组日期吗?我们需要更多的信息。嗯,我本来打算批准发布的CTE答案,但现在看起来好像被删除了。Top回答并整理问题。中央Top 1可以更改为任何数字,以获得去年的相应月数。按相反顺序排列的最外层的1从列表中得到最低的条目。我不知道去年相应的月份数。这个数字不能被计算到查询中吗?如果您给出表中数据的示例以及结果,我可以帮助您