sql >> データベース >  >> RDS >> Oracle

2つのifブロックを組み合わせて単一のクエリを作成する

    (注:このコードはテストされていないため、コンマや括弧がずれている可能性があります...)

    これら 2 つのブロックはアクション列と結合のみが異なるように見えるため、2 つの IF 脚を削除して、p_update_mode のチェックを次のような CASE ステートメントに移動できます。

    CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
                                                      p_update_mode VARCHAR2) IS
    BEGIN
      INSERT INTO dynamicentitygtt
        (entity_type, entity_id, entity_code, synonyms, action)
        WITH data_view AS
         ( -- ITEM table
          SELECT 'ITEM' entity_type, -- This separates inserted values
                  item_id data_id,
                  item_name data_name,
                  item_desc data_desc,
                  creation_date
            FROM itemde
          UNION ALL
          -- ORG table
          SELECT 'ORG' entity_type, -- This separates inserted values
                  org_id,
                  org_name,
                  org_desc,
                  creation_date
            FROM orgde
          -- NEXT entity table
          )
        SELECT upper(t.entity_type),
               t.data_id,
               t.data_name,
               t.data_desc,
               CASE lower(p_update_mode)
                 WHEN 'incremental' THEN
                   CASE
                     WHEN t.creation_date > b.max_last_update_date THEN
                       'update'
                     WHEN t.creation_date < b.max_last_update_date THEN
                       'add'
                   END
                 WHEN 'full' THEN
                  'add' 
               END action
          FROM data_view t
               LEFT JOIN batch_run_details b
                      ON b.entity_type = t.entity_type
                     AND lower(p_update_mode )='incremental'
         WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL)
           AND (lower(p_update_mode) = 'full'
                OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL)
               );
            
    END update_dynamic_entity;
      

    FULL ブロック内のクエリは、このモードで B に参加すべきではないと言っています。したがって、LEFT JOIN 句は INCREMENTAL モードの場合にのみ行を返しますが、FULL モードの場合は行を生成しません。

    これは LEFT 結合である必要があります。そうしないと、FULL モードの B のエンティティに対応しない行が data_view から取得されない可能性があります。つまり、これが通常の JOIN のままである場合、結合の AND 句のために、クエリ全体で FULL モードでゼロ行が取得されます。

    最後に、LEFT JOIN があるため、一番下の WHERE 句の AND フィルターが必要になります。これがないと、INCREMENTAL モードで実行すると、B に対応するエンティティ行があるかどうかに関係なく、data_view にすべての行が表示されます。 entity_id で結合している場合でも、左結合は、B に一致する行がなくても、T の各行に対して行を戻します。これが LEFT JOIN が設計されているためです。

    とはいえ、これら 2 つのブロックをブレンドする価値があるかどうかを判断する必要があります。できるからといって、そうすべきだというわけではありません。そのままにしておくと、パフォーマンスが向上する可能性があります。いくつかのテストを実行してください。データの量と処理の頻度を知っているのはあなただけです。次の担当者がここで何が起こっているのかを理解する必要があるため、コードのメンテナンスについても考慮する必要があります。




    1. クエリによるMySQLダンプ

    2. 別のテーブルからの SQL Server 計算列の選択

    3. 2つの日付の間隔を月ごとに詳細に分割するにはどうすればよいですか?

    4. データベースエラー発生エラー番号:1062