0

違い

  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

またはすべてのカウント

パフォーマンスの違いやその他の問題が発生しているのではないかと考えています。それはより良い方法が存在しますか?

4

1 に答える 1

4

両者の間にパフォーマンスの違いはありません。

個人的には、CASE ベースのソリューションを好む傾向があります。CASE は、Oracle 固有の関数ではなく、ANSI 標準です。他のデータベース プラットフォームから来た開発者は、おそらく 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 と 2 番目のクエリの SUM を使用し、いくつかの関数呼び出しを追加して、どのタイプの形式/役割が議論されているかを判断します。これにより、FORMAT_ID/ROLE_ID 値をあちこちにハードコーディングする必要がなくなります。また、COUNT ではなく SUM を使用する方が少し明確です。開発者にとって、COUNT が NULL 値を除外することはおそらくすぐには明らかではないからです。

于 2011-01-26T17:39:57.977 に答える