sql >> Databáze >  >> RDS >> Oracle

vytvořit pohled oracle na základě porovnání dat mezi dvěma databázovými tabulkami

Potřebujete LEAST() funkce spolu se 3 poddotazy v kombinaci s UNION doložky. Dva z poddotazů by měly obsahovat FULL JOIN mezi tabulkami:

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  

za první case :Je třeba vrátit pouze minimální hodnotu ve smyslu member_ratio s i.member_descr = 'O' odpovídá.

na druhou case :Obousměrný(FULL JOIN ) je prý potřeba logika

za třetí případ :vnější spojení odpovídající pozici IS_ID_TST tabulka (v aktuálním případě je to RIGHT JOIN ) je potřeba spolu s neekvivalentními hodnotami member_desct na hodnotu 'O' (i hodnoty NULL by měly být aliminovány a NVL() pro tento účel je přidána funkce )

A všechny tyto dílčí dotazy specifikované ve třech případech by měly být kombinovány s UNION za účelem poskytnutí kombinace po řádcích včetně eliminace opakovaných řádků.

Ukázka



  1. PHP:ekvivalent funkce MySQL SUBSTRING_INDEX ?

  2. Výjimka formátu Oracle Date v SQL Server Reporting Services

  3. PostgreSQL:efektivní získávání pořadové pozice (index řádku?).

  4. MySQL skutečně odlišné spojení