如何避免重新运行多次使用的子查询?

How to avoid rerunning a subquery used multiple times?

以下是我 运行 遇到的问题的简化示例。假设我有一个查询“SomeQuery”(SELECT... FROM...WHERE...),它给出的输出如下所示:

状态 我的日期
一个 2021 年 6 月 14 日
一个 2021 年 6 月 12 日
B 2021 年 6 月 10 日
一个 2021 年 6 月 8 日
B 2021 年 6 月 6 日
一个 2021 年 6 月 4 日

我需要获取大于最大状态 B 日期的最早状态 A 日期。在这种情况下,6/12/2021.

我有一个如下所示的查询:

SELECT
  MIN(MyDate) AS DateNeeded
FROM
  SomeQuery
WHERE
  Status = 'A'
  AND MyDate > (
    SELECT
      MAX(MyDate) AS MaxDateB
    FROM
      SomeQuery
    WHERE
      Status = 'B'
  )

这行得通,但我想避免 运行 两次子查询。我尝试为子查询的第一个实例分配一个别名,然后使用该别名代替第二个实例,但这会导致“无效的对象名称”错误。

如有任何帮助,我们将不胜感激。谢谢

但是为了避免击中 table 两次,您可以使用 window 函数:

select top(1) Mydate from 
(
 select *, max(case when Status = 'B' then Mydate end) over () MaxBDate from data 
) t 
where status = 'A'
and MyDate > MaxBDate
order by Mydate

db<>fiddle here

我不确定我是否完全理解您的需求,但可以这样做:

;WITH cte (MaxMyDate) as
(
   SELECT
      MAX(MyDate) AS MaxDateB
    FROM
      SomeQuery
    WHERE
      Status = 'B'    
)
SELECT
  MIN(MyDate) AS DateNeeded
FROM
  SomeQuery
WHERE
  Status = 'A'
  AND MyDate > (SELECT MaxMyDate from cte)

有些人可能会觉得这更容易阅读,因为一些复杂性已移至 cte。