2016-05-04 19 views
0

私は特にひどく見える古いSQLクエリを書き直そうとしています。優先順位のためにwhereステートメントの値の優先順位を付けるより効率的な方法があるのだろうかと思います。基本的に、このテーブルにはユーザごとに複数のemail_codeレコードが含まれていますが、どのレコードが優先されるかに基づいて優先順位を付けたいと思います。この場合、email_codeがWORKの場合は選択する必要があります。しかし、WORKレコードがない場合は、HOMEを選択する必要があります。ここで私が働いているものの例です。これを行うにはより優雅な方法が必要です...?oracleは優先度に基づいて選択します

select 
    * 
from 
    email m 
where 
    status_ind='A' 
    and decode(email_code, 'WORK',1, 
          'HOME',2, 
          'ALT1',3, 
          'ALT2',4,5) = (select 
              min(decode(email_code, 'WORK',1, 
                   'HOME',2, 
                   'ALT1',3, 
                   'ALT2',4,5)) 
             from 
              email 
             where 
              email_uid = m.email_uid 
              and status_ind='A'); 
+0

あなたはCOALESCEを参考にしていますか? https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm – Danilo

+0

この状況では、COALESCEは機能しません。場合によっては、レコードにこれらのコードの4つすべてが含まれる場合があります。それは優先順位の詳細です。 – oljones

答えて

1

試してみてください。

SELECT * FROM (
    SELECT e.*, 
      dense_rank() over (PARTITION BY user_id 
      ORDER BY CASE email_code 
       WHEN 'WORK' THEN 1 
       WHEN 'HOME' THEN 2 
       WHEN 'ALT1' THEN 3 
       WHEN 'ALT2' THEN 4 
       ELSE 5 
      END) As priority 
    FROM emails e 
    WHERE status_ind='A' 
) 
WHERE priority = 1 
+0

これは私の状況に最適です。ありがとう! – oljones

0

ああ、私はここにOracleはありませんでしたが、私はあなたがすべてのこの

select * from (
    select *,min(decode(email_code, 'WORK',1, 
     'HOME',2,'ALT1',3,'ALT2',4,5)) mincode 
     over(partition by (email_uid)) 
    where status_ind='A' 
) where email_code=mincode 
0

ファーストのようなものを使用することができ、ルックアップを作成するために、より良いものでなければならないと思います電子メールの種類とその優先順位を保持するテーブル。そして、このルックアップテーブルをあなたのメールテーブルに参加させることができます。最後に、Oracle分析関数(row_number、rank、dense_rankなど)のいずれかを使用して最優先の関数を使用するようにしても問題ありません。

関連する問題