Лучшие коды для разработки - PullRequest
0 голосов
/ 26 января 2011

ОТЛИЧИЯ

  select CE1.CLASS_ID, 
         CE1.LOCATION_ID,
         count(case CE1.FORMAT_ID  when 5 then 1 end) as LIVE,
         count(case CE1.FORMAT_ID  when 14 then 1 end) as LB,
         count(case CE1.FORMAT_ID  when 15 then 1 end) as WEB,
         SUM(DECODE (CE1.ROLE_ID,5,1,0)) FACULTY,
         SUM(DECODE  (CE1.ROLE_ID ,2,1,0)) MODERATOR,
         SUM(DECODE  (CE1.ROLE_ID ,3,1,0)) PANELIST,  
         SUM(DECODE  (CE1.ROLE_ID,4,1,0)) PRESENTER,
         COUNT(CE1.USER_ID) TOT 
    from C_EDUCATION1 CE1 
GROUP BY CE1.LOCATION_ID, CE1.CLASS_ID

Мы развиваем существующую систему, и мы обнаружили смешанное использование COUNT и DECODE. Если мы правильно понимаем, мы можем преобразовать в следующие коды.

  select CE1.CLASS_ID,  
         CE1.LOCATION_ID, 
         SUM(DECODE (CE1.FORMAT_ID ,5,1,0)) LIVE,
         SUM(DECODE  (CE1.FORMAT_ID ,14,1,0)) LB, 
         SUM(DECODE  (CE1.FORMAT_ID,15,1,0)) WEB,
         SUM(DECODE (CE1.ROLE_ID,5,1,0)) FACULTY,
         SUM(DECODE  (CE1.ROLE_ID ,2,1,0)) MODERATOR,
         SUM(DECODE  (CE1.ROLE_ID ,3,1,0)) PANELIST,  
         SUM(DECODE  (CE1.ROLE_ID,4,1,0)) PRESENTER,
         COUNT(CE1.USER_ID) TOT 
    from C_EDUCATION1 CE1 
GROUP BY CE1.LOCATION_ID, CE1.CLASS_ID

OR Все COUNT

Нам интересны различия в производительности или другие проблемы. Есть ли лучший способ существовать?

1 Ответ

4 голосов
/ 26 января 2011

Между ними не будет разницы в производительности.

Лично я бы предпочел решение на основе CASE. CASE - это стандарт ANSI, а не специфичная для Oracle функция. Разработчикам, которые приходят с других платформ баз данных, вероятно, придется искать семантику оператора DECODE. CASE также относительно очевиден для разработчиков, независимо от языка, с которым они знакомы. Практически на каждом языке есть оператор CASE, поэтому любой разработчик должен иметь возможность быстро увидеть, что вы делаете.

При этом я склонен защищать что-то вроде

SELECT ce1.class_id,
       ce1.location_id,
       SUM( CASE WHEN format_pkg.is_live( format_id ) = 'Y' THEN 1 ELSE 0 END ) live,
       SUM( CASE WHEN format_pkg.is_lb(   format_id ) = 'Y' THEN 1 ELSE 0 END ) lb,
       ...

При этом используется CASE из первого запроса, SUM из второго и добавляются некоторые вызовы функций, чтобы определить, какой тип формата / роли обсуждается. Это предотвращает необходимость жесткого кодирования значений FORMAT_ID / ROLE_ID повсюду. И использование SUM, а не COUNT немного яснее, поскольку для разработчика, вероятно, не сразу очевидно, что COUNT исключает значения NULL.

...