Что касается определений представлений, я бы построил два представления и разделил их - ни одно представление не будет ссылаться на другое.Это позволит вам оптимизировать запросы независимо и избежать любых проблем, которые могут возникнуть с представлениями, размещенными поверх представлений;слишком большое количество уровней может сделать управление базами данных, обслуживание и рефакторинг особенно трудными.
Что касается агрегирования данных, общие тактики включают следующее.Сравните, сопоставьте, протестируйте и экстраполируйте, чтобы увидеть, что лучше всего подходит для вашей среды:
Подзапросы
SELECT mt.Id, st1.HowMany, st2.HowManyOther, <etc>
from MainTable mt
inner join (select Id, count(*) HowMany
from SubTable1
group by Id) st1
on st1.Id = mt.Id
inner join (select Id, count(*) HowMany
from SubTable2
group by Id) st2
on st2.Id = mt.Id
Довольно просто, хотя подзапросы могут быть дорогостоящими, даже при правильном индексировании.
count (отличный от xx)
SELECT mt.Id, count(distinct st1.UniqueKey) HowMany, count(distinct st2.UniqueKey) HowManyOther, <etc>
from MainTable mt
inner join SubTable1 st1
on st1.Id = mt.Id
inner join SubTable2
on st2.Id = mt.Id
Для этого требуется один уникальный столбец в «subtables», и он становится беспорядочным, если у вас естьдля работы с внешними объединениями или NULL.
Добавлено
Во-первых, замена внутренних объединений (левыми) внешними объединениями в любом из указанных выше запросов приведет к счету 0+из подтаблиц, если вы уверены, что подсчет выполняется на «правильной» таблице (потому что значения NULL не подсчитываются).Чтобы выяснить, что лучше всего работает в вашей среде, вам нужно написать и протестировать оба запроса.Я бы предположил второе, поскольку первое требует сканирования таблиц в таблицах подзапросов, в то время как второе выполняет соединения и поэтому может оптимизировать лучше, но оптимизатор SQL-запросов умнее меня (потому что он знает ваши индексы и имеет гистограммы распределенияваши данные), так что вы хотите увидеть, что это такое.
Что касается «многоуровневых представлений», если я правильно следую логике, я бы рекомендовал строить Внутреннее представление как сложное / всеобъемлющеезапрос (все объединения, все соответствующие столбцы), а затем создайте представление Customer, которое, как мы надеемся, так же просто, как
SELECT <customerOnlyColumns>
from vw_Internal