Имате нужда от 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
за да се осигури комбинация по ред, включително елиминирането на повтарящите се редове.