كيفية إعادة كتابة المتقاطع تنطبق على Join Inner لجعل العرض مفهرسة
-
28-09-2019 - |
سؤال
على موضوع منفصل حصلت على مثال عاملة على كيفية ترجمة Proc المخزنة إلى عرض ، والتي ستحمل أسماء العملاء على رسم الخرائط ، حيث تكون الطلبات قوائم مفصولة بفاصلة ، بما في ذلك NULL لعدم الطلبات. لذلك بالنسبة للجدول أدناه ، أحتاج إلى ظهور ما يلي في العرض:
Name Orders
'John' New Hat, New Book, New Phone
'Marry' NULL
أحتاج إلى فهرسة العرض ، لكن لا يمكنك القيام بذلك إذا كان الاستعلام SELECT داخل العرض قد تم تطبيقه و/أو الفوز الفرعي. هل من الممكن ترجمة هذا العرض إلى طريقة عرض مفهرسة؟
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 Inner Join Y على 1 = 1