Bạn cần LEAST()
cùng với 3 truy vấn con được kết hợp với UNION
điều khoản. Hai trong số các truy vấn con phải chứa FULL JOIN
giữa các bảng:
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
cho lần đầu tiên trường hợp:Chỉ cần trả lại giá trị tối thiểu trong điều khoản của member_ratio với i.member_descr = 'O'
phù hợp.
trong giây trường hợp:Hai chiều (FULL JOIN
) logic được yêu cầu là cần thiết
cho thứ ba case:Một tham gia bên ngoài tương ứng với vị trí của IS_ID_TST
bảng (trong trường hợp hiện tại là RIGHT JOIN
) là cần thiết cùng với các giá trị không tương đương của member_desct
thành giá trị 'O'
( các giá trị thậm chí NULL phải được phân biệt và NVL()
chức năng được thêm cho mục đích này )
Và tất cả các truy vấn con được chỉ định trong ba trường hợp này phải được kết hợp với UNION
để cung cấp sự kết hợp thông minh theo hàng, bao gồm cả việc loại bỏ các hàng lặp lại.