Oracle
 sql >> Base de données >  >> RDS >> Oracle

créer une vue oracle basée sur la comparaison des données entre deux tables de base de données

Vous avez besoin de LEAST() fonction avec 3 sous-requêtes combinées avec UNION clauses. Deux des sous-requêtes doivent contenir FULL JOIN parmi les tables :

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  

pour le premier case :Seulement besoin de retourner la valeur minimale en termes de member_ratio avec i.member_descr = 'O' correspondances.

pour la seconde case :Bidirectionnel(FULL JOIN ) on dit que la logique est nécessaire

pour le troisième case :Une jointure externe respectif à la position de IS_ID_TST table (dans le cas actuel c'est RIGHT JOIN ) est nécessaire avec des valeurs non équivalentes de member_desct à la valeur 'O' (même les valeurs NULL doivent être éliminées, et NVL() une fonction est ajoutée pour cet objectif )

Et toutes ces sous-requêtes spécifiées dans les trois cas doivent être combinées avec UNION afin de fournir une combinaison par ligne, y compris l'élimination des lignes répétées.

Démo