Oracle
 sql >> база данни >  >> RDS >> Oracle

създаване на изглед на Oracle въз основа на сравнение на данни между две таблици на база данни

Имате нужда от LEAST() функция заедно с 3 подзаявки, комбинирани с UNION клаузи. Две от подзаявките трябва да съдържат 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  

за първите case :Трябва само да върнете минималната стойност по отношение на member_ratio с i.member_descr = 'O' съвпадения.

за втория case :двупосочно(FULL JOIN ) се казва, че е необходима логика

за третите case :външно съединение съответно на позицията на IS_ID_TST таблица (в настоящия случай това е RIGHT JOIN ) е необходимо заедно с нееквивалентни стойности на member_desct към стойността 'O' (дори NULL стойностите трябва да бъдат елиминирани и NVL() за тази цел е добавена функция )

И всички тези подзаявки, посочени в трите случая, трябва да се комбинират с UNION за да се осигури комбинация по ред, включително елиминирането на повтарящите се редове.

Демо



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли функция за разделяне на низ в PL/SQL?

  2. Как да тествате (единично) PL/SQL приложение с интензивно използване на данни

  3. TIMESTAMPDIFF в Oracle 11g?

  4. Промяна на първичния ключ

  5. Проектиране на база данни и моделиране на специфични връзки