У меня следующий запрос. Здесь «B» дает мне неповторяющиеся MessageIds, и я использую их в подзапросе с 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 несколько раз. Можем ли мы оптимизировать его дальше?