2016-12-12 7 views
1

У нас есть 5 таблиц, и мы пытаемся создать представление, чтобы получить результаты.Текущая оптимизация запросов

Ниже представлен вид, который отлично работает.

Мне нужны предложения. Это хорошая практика, чтобы написать этот запрос таким образом или его можно оптимизировать в лучшем виде.

SELECT p.Pid, hc.hcid, hc.Accomodation, ghc.ghcid, ghc.ProductFeatures, wp.existing, wp.acute, mc.cardiaccover, mc.cardiaclimitationperiod 
FROM TableA p 
     LEFT JOIN TableB hc 
      ON p.pid = hc.pid 
     LEFT JOIN TableC ghc 
      ON p.pid = ghc.pid 
     LEFT JOIN (SELECT * 
       FROM (SELECT hcid, 
           title, 
           wperiodvalue + '-' + CASE WHEN 
           wperiodvalue > 1 THEN 
           unit + 
             's' ELSE 
           unit END wperiod 
         FROM TableD) d 
         PIVOT (Max(wperiod) 
           FOR title IN (acute, 
              existing 
              )) piv1) wp 
      ON hc.hcid = wp.hcid 
     LEFT JOIN (SELECT * 
       FROM (SELECT hcid, 
           title + col new_col, 
           value 
         FROM TableE 
           CROSS apply (VALUES (cover, 
              'Cover'), 
                (Cast(limitationperiod AS 
                  VARCHAR 
                  (10)), 
              'LimitationPeriod')) x (value, col 
              )) d 
         PIVOT (Max(value) 
           FOR new_col IN (cardiaccover, 
               cardiaclimitationperiod, 
               cataracteyelenscover, 
               cataracteyelenslimitationperiod 
              )) piv2) mc 
      ON hc.hcid = mc.hcid 

Любые предложения будут оценены.

Благодаря

+0

Тег dbms, который вы используете. (Различные продукты dbms оптимизируются по-разному). – jarlh

ответ

0

Мое предложение разбить запрос, используя временную таблицу, создать хранимую процедуру затем выгрузить данные в одну новую таблицу и с помощью этой таблицы вы можете создать вид:

магазин как PIVOT результат буксирных индивидуальной временных таблиц, как

SELECT * INTO #pvtInfo FROM ( --first PIVOT query 
SELECT * INTO #pvtInfoTwo FROM ( --second PIVOT query 

Тогда ваш окончательный запрос будет как:

SELECT p.Pid, 
    hc.hcid, 
    hc.Accomodation, 
    ghc.ghcid, 
    ghc.ProductFeatures, 
    wp.existing, 
    wp.acute, 
    mc.cardiaccover, 
    mc.cardiaclimitationperiod 
FROM TableA p 
LEFT JOIN TableB hc ON p.pid = hc.pid 
LEFT JOIN TableC ghc ON p.pid = ghc.pid 
LEFT JOIN #pvtInfo wp ON hc.hcid = wp.hcid 
LEFT JOIN #pvtInfoTwo mc ON hc.hcid = mc.hcid 

Сначала вы можете попробовать, а затем пойти только с SP и VIEW.

Надеюсь, это поможет.