Как переписать Cross, примените к внутреннему соединению, чтобы сделать представленное представление

StackOverflow https://stackoverflow.com/questions/4089575

Вопрос

На отдельная нить У меня есть рабочий пример о том, как перевести мою хранимую ProC в представлении, что будет проводить имена клиентов на сопоставление заказов, где заказы являются заказами, разделенными запятыми списки заказов, включая NULL без заказов. Таким образом, для таблицы ниже мне нужна следующее, чтобы появиться в виду:

Name     Orders
'John'   New Hat, New Book, New Phone
'Marry'  NULL

Мне нужно индексировать представление, но вы не можете сделать это, если выберите запрос внутри представления, и / или подзапросы. Можно ли перевести этот вид на проиндексированный вид?

create table Customers (CustomerId int, CustomerName VARCHAR(100))
create table Orders    (CustomerId int, OrderName VARCHAR(100))

insert into Customers  (CustomerId, CustomerName) select 1, 'John' union all select 2, 'Marry'
insert into Orders     (CustomerId, OrderName)    select 1, 'New Hat' union all select 1, 'New Book' union all select 1, 'New Phone'
go

create view OrderView as 
select c.CustomerName, x.OrderNames        
from Customers c            
cross apply (select stuff((select ',' + OrderName from Orders o 
      where o.CustomerId = c.CustomerId for xml path('')),1,1,'') 
      as OrderNames) x
go
Это было полезно?

Решение

Вы не можете сделать это представленное представлением.

В основном, у вас есть агрегатная функция здесь (замаскированная как CROSS APPLY).

Единственные агрегатные функции, разрешенные в проиндексированном представлении, COUNT_BIG и SUM, потому что они распространяют постановку дополнения и вычитания, то есть SUM(a UNION ALL b) = SUM(a) + SUM(b), SUM(a EXCEPT ALL b) = SUM(a) - SUM(b).

Это свойство требуется для поддержания индекса.

Когда новая запись вставлена, обновляется или удалена из базовой таблицы, все представление не нужно переоценить: значение новой записи просто добавляется или вычитается из совокупной стоимости.

Кроме того, COUNT_BIG Должна быть частью представления, чтобы отслеживать удаления записей (когда это становится 0, запись должна быть удалена из индекса вида).

Другие советы

Если вы используете внутреннее соединение с 1 = 1, он удовлетворит условие и позволит присоединиться.

Выберите * из X Внутреннее Присоединяйтесь к y на 1 = 1

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top