Как получить результат запроса в представлении, а не при выполнении запроса?
Я хочу создать вид с длинным запросом, как:
CREATE VIEW doubleV
AS
SELECT * FROM X1 as R
WHERE [Ext] IN
(
SELECT [Ext] FROM X1 as RR
WHERE RR.cliID=R.cliID
AND Soc='j'
GROUP BY [Ext]
HAVING COUNT(*) > 1
)
Но когда я выбираю все элементы из этого ПРОСМОТРА, сервер Sql просто выполняет запрос внутри представления, что занимает много времени.
Можно ли выполнить запрос в VIEW CREATION?
Что-нибудь позволило бы мне сделать временную таблицу с результатом запроса?
2 ответа
Смотрите здесь:
Набор результатов стандартного представления не сохраняется постоянно в базе данных. Каждый раз, когда запрос ссылается на представление, Microsoft® SQL Server™ 2000 динамически объединяет логику, необходимую для построения набора результатов просмотра, в логику, необходимую для построения полного набора результатов запроса из данных в базовых таблицах. Процесс построения результатов представления называется материализацией представления.
Поэтому вам нужно создать INDEXED VIEW, чтобы сделать это, вы можете прочитать это.
Вам понадобится следующий код (возможно, некоторые опечатки):
CREATE VIEW doubleV
AS
SELECT * FROM X1 as R
WHERE [Ext] IN
(
SELECT [Ext] FROM X1 as RR
WHERE RR.cliID=R.cliID
AND Soc='j'
GROUP BY [Ext]
HAVING COUNT(*) > 1
)
GO
CREATE UNIQUE CLUSTERED INDEX doubleVInd ON doubleV (field_you_want)
Где field_you_want - это поле, по которому вы индексируете, скорее всего, идентификатор.
Ты можешь использовать
SELECT … INTO NewTableName
FROM …
создать таблицу с результатами запроса (в таблице не будет ключей, и ее можно будет обновлять).
Вы также можете создать "индексированное представление": это копия результатов представления, обычно предназначенное для периодического обновления (например, каждые несколько минут выполняется дорогостоящий запрос, чтобы сбалансировать свежесть результатов со стоимостью получать их). Это часто называют "материализованным представлением".