Question

thread séparé je suis un exemple de travail sur la façon de traduire mon stocké proc à une vue, qui contiendra les noms des clients à la cartographie des commandes, où les commandes sont des listes séparées par des virgules des ordres, y compris NULL pour aucune commande. Donc, pour le tableau ci-dessous, j'ai besoin ce qui suit pour apparaître dans la vue:

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

Je dois indexer la vue, mais vous ne peux pas le faire si la requête SELECT dans une vue est d'appliquer et / ou les sous-requêtes. Est-il possible de traduire ce point de vue à une vue indexée?

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
Était-ce utile?

La solution

Vous ne pouvez pas faire ce point de vue indexée.

En gros, vous avez une fonction d'agrégation ici (sous couvert CROSS APPLY).

Les seules fonctions globales autorisées dans une vue indexée sont COUNT_BIG et SUM, parce qu'ils distribuent plus sur ensemble et la soustraction, qui est SUM(a UNION ALL b) = SUM(a) + SUM(b), SUM(a EXCEPT ALL b) = SUM(a) - SUM(b).

Cette propriété est nécessaire pour que l'index soit maintenable.

Lorsqu'un nouvel enregistrement est inséré, mis à jour ou supprimé de la table sous-jacente, la vue entière n'a pas besoin d'être réévaluées:. La valeur du nouvel enregistrement est vient d'être ajouté ou soustrait de la valeur globale

En outre, un COUNT_BIG devrait être une partie de la vue et, pour suivre les suppressions d'enregistrements (quand il devient 0, un dossier doit être supprimé de l'index de vue).

Autres conseils

Si vous utilisez une jointure avec 1 = 1, il va satisfaire à la condition, et permettre à la jointure.

Sélectionnez * de x jointure interne y sur 1 = 1

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top