如何避免重新运行多次使用的子查询?
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。
以下是我 运行 遇到的问题的简化示例。假设我有一个查询“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。