Как запустить объединенный подзапрос один раз для всех строк? - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно сделать что-то вроде этого:

SELECT T.*, X.Val
FROM SomeTable T
LEFT OUTER JOIN (SELECT TOP 1 A.[Value] AS Val FROM AnotherTable A ORDER BY A.Id DESC) X ON X.Val = X.Val

Цель состоит в том, чтобы получить одно значение из подзапроса и присоединить / применить его ко всем строкам моего набора записей. Значение из подзапроса одинаково для всех строк и не зависит от них. Поэтому было бы эффективно запустить подзапрос только один раз, а затем использовать только извлеченное значение для всех строк. Но, исходя из времени выполнения запроса, кажется, что подзапрос снова выполняется для каждой строки, что является медленным. То же самое было и с другими способами, которые я пробовал, например, с внешним применением и т. Д.

На самом деле мой подзапрос выглядит так:

(SELECT dbo.MyScalarFunction() AS Val) X

Но я надеюсь, что это не должно иметь значения. Сама скалярная функция выполняется около 1 секунды, поэтому она должна запускаться только один раз во всем запросе, я не могу ждать тысячи секунд для тысяч строк в наборе записей.

Есть ли способ принудительно запуститьподзапрос только один раз, прежде чем присоединиться к нему?

Я нахожусь внутри представления, поэтому я не могу использовать объявленную переменную для хранения значения подзапроса.

1 Ответ

1 голос
/ 18 октября 2019

Почему вы говорите, что это из другого стола? Основываясь на вашем последующем вопросе, почему бы просто не использовать CROSS JOIN:

SELECT T.*, X.Val
FROM SomeTable T CROSS JOIN
     (SELECT dbo.MyScalarFunction() AS Val) X

Я не вижу, как функция будет вызываться более одного раза, если только она не является рекурсивной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...