SQL Server将如何执行此WITH子句

我有以下查询。这里的“ B”给了我非重复的MessageId,我在A的子查询中使用它们,B在内部使用A。

因此,当我在最后一部分中调用SELECT时,它将再次执行A还是使用在调用B时已经获取的数据?

WITH A as (

    SELECT z.Name,ze.Inside,ze.MessageId,ze.DateTime
    FROM ZonestateEntries ze
    INNER JOIN Zone z
    ON ze.ZoneId = z.ZoneId
    WHERE ze.ObjectId = 1324
    AND (Inside = 1 OR Inside = 0)
    AND ze.DateTime BETWEEN '2018-10-22 00:00:00' AND '2019-11-05 00:00:00'

),B as (

    SELECT a.MessageId
    FROM A a
    INNER JOIN A b
    on a.MessageId = b.MessageId 
    GROUP BY a.MessageId
    HAVING COUNT(a.MessageId) = 1

)

SELECT *
FROM A
WHERE MessageId IN (
    SELECT *
    FROM B
)
AND a.Inside = 1
ORDER BY DateTime DESC

这里的数据非常庞大,我们无法多次执行查询A。我们可以进一步优化它吗?

inlovelove 回答:SQL Server将如何执行此WITH子句

A a INNER JOIN A b似乎不必要。您可以使用COUNT(DISTINCT MessageId)来获取唯一消息。

WITH A as (
    SELECT z.Name,ze.Inside,ze.MessageId,ze.DateTime
    FROM ZoneStateEntries ze
    INNER JOIN Zone z
    ON ze.ZoneId = z.ZoneId
    WHERE ze.ObjectId = 1324
    AND (Inside = 1 OR Inside = 0)
    AND ze.DateTime BETWEEN '2018-10-22 00:00:00' AND '2019-11-05 00:00:00'
)
SELECT *
FROM A
WHERE MessageId IN (
    SELECT MessageId
    FROM A 
    GROUP BY MessageId
    HAVING COUNT(DISTINCT MessageId) = 1
)
AND a.Inside = 1
ORDER BY DateTime DESC
本文链接:https://www.f2er.com/3158375.html

大家都在问