Crossを書き直す方法内側の結合に適用するためにビューをインデックス化するようにする
-
28-09-2019 - |
質問
aで 個別のスレッド 保存された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)
.
このプロパティは、インデックスが保守可能になるために必要です。
基礎となるテーブルから新しいレコードが挿入、更新、または削除された場合、ビュー全体を再評価する必要はありません。新しいレコードの値は、集約値から追加または差し引かれます。
さらに、a COUNT_BIG
レコードの削除を追跡するために、ビューの一部である必要があります( 0
, 、ビューインデックスからレコードを削除する必要があります)。
他のヒント
1 = 1で内部結合を使用すると、条件が満たされ、結合が許可されます。
select * from x内側結合y on 1 = 1
所属していません StackOverflow