Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menggabungkan 2 jika memblokir dan membuat satu kueri

(CATATAN:kode ini belum diuji dan saya mungkin menggunakan koma di sini atau tanda kurung di sana...)

Kedua blok tersebut tampaknya hanya berbeda dalam kolom aksi dan gabungan, sehingga Anda dapat menghilangkan 2 kaki IF dan memindahkan pemeriksaan p_update_mode ke dalam pernyataan CASE seperti ini:

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;

Kueri di blok LENGKAP Anda mengatakan bahwa kita tidak boleh bergabung ke B dalam mode ini. Jadi klausa LEFT JOIN hanya mengembalikan baris ketika dalam mode INCREMENTAL, tetapi seharusnya tidak menghasilkan baris untuk mode LENGKAP.

Ini harus bergabung dengan KIRI atau kami mungkin tidak mendapatkan baris apa pun dari tampilan_data Anda yang tidak sesuai dengan entitas di B untuk mode LENGKAP. Dengan kata lain, jika ini tetap GABUNG biasa, keseluruhan kueri Anda akan mendapatkan nol baris dalam mode LENGKAP karena klausa AND dalam gabungan.

Terakhir, filter AND di klausa WHERE di bagian bawah menjadi perlu sekarang karena ada LEFT JOIN. Tanpa ini, saat menjalankan dalam mode INCREMENTAL, Anda akan mendapatkan SETIAP baris di data_view Anda TERLEPAS dari ada baris entitas yang sesuai di B atau tidak. Meskipun Anda bergabung di entity_id, gabungan kiri akan mengembalikan baris untuk setiap baris di T bahkan tanpa baris yang cocok di B, karena itulah yang dirancang untuk dilakukan oleh LEFT JOIN.

Semua yang dikatakan, Anda harus memutuskan apakah layak memadukan kedua blok ini. Hanya karena Anda BISA, bukan berarti Anda HARUS. Kinerja Anda mungkin lebih baik membiarkannya seperti yang Anda miliki--jalankan beberapa tes. Hanya Anda yang tahu volume data dan frekuensi pemrosesan. Anda juga perlu mempertimbangkan pemeliharaan kode Anda, karena orang berikutnya harus mencari tahu apa yang terjadi di sini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa memilih dari prosedur tersimpan tidak didukung dalam database relasional?

  2. Memigrasikan Oracle Database dari AWS EC2 ke AWS RDS, Bagian 4

  3. Oracle memilih catatan tanggal terbaru

  4. Panjang sebenarnya dari sebuah String, seperti yang terlihat oleh Oracle

  5. Hapus baris duplikat dalam tabel