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

2つのデータベーステーブル間のデータの比較に基づいてOracleビューを作成します

    LEAST()が必要です UNIONと組み合わせた3つのサブクエリとともに機能します 条項。 2つのサブクエリにはFULL JOINが含まれている必要があります テーブル間:

    CREATE VIEW V_MEMBER_FUND AS    
    SELECT i.fund_isin,
           i.member_descr,
           LEAST(i.member_ratio, t.member_ratio) AS member_ratio,
           i.allocationassettype
      FROM IS_ID i
      JOIN IS_ID_TST t
        ON t.fund_isin = i.fund_isin
       AND t.member_descr = i.member_descr
     WHERE i.member_descr = 'O'
    UNION
    SELECT LEAST(NVL(i.fund_isin,t.fund_isin),NVL(t.fund_isin,i.fund_isin)) AS fund_isin,
           LEAST(NVL(i.member_descr,t.member_descr),NVL(t.member_descr,i.member_descr)) AS member_descr,
           LEAST(NVL(i.member_ratio,t.member_ratio),NVL(t.member_ratio,i.member_ratio)) AS member_ratio,
           LEAST(NVL(i.allocationassettype,t.allocationassettype),NVL(t.allocationassettype,i.allocationassettype)) AS allocationassettype
      FROM IS_ID i
      FULL JOIN IS_ID_TST t
        ON t.fund_isin = i.fund_isin
     WHERE (i.member_descr = 'O' OR t.member_descr = 'O' )
       AND ( t.fund_isin IS NULL OR i.fund_isin IS NULL )
    UNION
    SELECT t.fund_isin,
           t.member_descr,
           t.member_ratio,
           t.allocationassettype
      FROM IS_ID i
     RIGHT JOIN IS_ID_TST t
        ON t.fund_isin = i.fund_isin
       AND t.member_descr = i.member_descr
     WHERE (NVL(i.member_descr,'XYZ') != 'O' OR NVL(t.member_descr,'XYZ') != 'O' )
       AND t.fund_isin IS NOT NULL  
    

    最初の場合 ケース:i.member_descr = 'O'のmember_ratioに関して最小値を返すだけで済みます 一致します。

    ケース:双方向(FULL JOIN )ロジックが必要であると言われています

    3番目の場合 ケース:外部参加 IS_ID_TSTの位置に対応 テーブル(現在の場合はRIGHT JOINmember_desctの同等でない値とともに必要です 値'O' NULL値も削除する必要があり、NVL() この目的のために機能が追加されました

    そして、3つのケースで指定されたすべてのサブクエリは、UNIONと組み合わせる必要があります。 繰り返される行の削除を含む行ごとの組み合わせを提供するため。

    デモ



    1. JDBCシンドライバのNLS_LANG設定?

    2. SQL Serverの列名としてステートメントを選択するために変数を渡すことはできますか

    3. ORA-27154 / ORA-27146

    4. SQLServerのCROSSAPPLYに類似したPostgres