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

时间:2018-08-15 10:38:06

标签: 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 Months.Period DESC

这将返回月结束日期,并且只需更改第二个TOP 1,即可在去年的任何月份前工作。

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

通过手动向LEFT JOIN查询输入日期,我可以运行主查询并在1秒内返回结果。但是,如果我将此子查询放在每个LEFT JOIN上,则可能要花一分钟多的时间才能运行。鉴于我想在过去的12个月中的每个月都运行此查询,这将使服务器占用不可接受的时间。

有什么方法可以运行查询,然后在LEFT JOIN子查询中引用此结果,而不必一遍又一遍地运行。目前,它的运行速度已超过10万次。

1 个答案:

答案 0 :(得分:1)

我已经不明白为什么要使用2 x top 1(top 1中的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