Frage

Auf einem separaten Thread Ich habe ein funktionierendes Beispiel, wie mein gespeichert übersetzen proc auf eine Ansicht, die die Kundennamen Aufträge Mapping halten, wo Aufträge durch Komma getrennte Listen von Aufträgen sind, für keine Aufträge einschließlich NULL. Also für die Tabelle unten, ich brauche die folgenden in der Ansicht angezeigt werden:

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

Ich brauche die Ansicht zu indizieren, aber man kann es tun, wenn die SELECT-Abfrage in einer Ansicht hat NEHMEN und / oder Unterabfragen. Ist es möglich, diese Ansicht zu einer indizierten Sicht zu übersetzen?

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
War es hilfreich?

Lösung

Sie können diese Ansicht nicht machen indiziert.

Grundsätzlich sind Sie mit einer Aggregatfunktion hier (getarnt als CROSS APPLY).

Die einzigen Aggregatfunktionen in einer indizierten Sicht erlaubt sind COUNT_BIG und SUM, weil sie über Set Addition und Subtraktion zu verteilen, die SUM(a UNION ALL b) = SUM(a) + SUM(b) ist, SUM(a EXCEPT ALL b) = SUM(a) - SUM(b).

Diese Eigenschaft ist für den Index erforderlich wartbar sein.

Wenn ein neuer Datensatz eingefügt, aktualisiert oder aus der zugrundeliegenden Tabelle gelöscht, die ganze Sicht muss nicht neu bewertet werden. Der Wert des neuen Datensatzes wird gerade addiert oder subtrahiert aus dem Gesamtwert

Darüber hinaus ist ein COUNT_BIG sollte auch ein Teil der Ansicht sein, Löschungen von Datensätzen zu verfolgen (wenn es 0 wird, sollte ein Datensatz aus der Sicht Index gelöscht werden).

Andere Tipps

Wenn Sie eine innere Verwendung kommen mit 1 = 1 wird die Bedingung erfüllen, und lassen Sie die Verbindung.

Wählen Sie * von x Exklusionsverknüpfung y auf 1 = 1

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top