如何解决基于两个数据库表之间的数据比较创建oracle视图
我有下表:
- 我要创建一个视图,以便对于两个表中的
descr = 'O'
和公共id_isin
字段值,检查ratio
字段并仅占据ratio
字段所在的行值低。 - 对于
descr = 'O'
,如果id_isin存在于一个表中但不存在于另一个表中,则取这些行(双向) - 对于
descr ! = 'O'
中的所有行,从表IS_ID_TST
中获取所有这些行。
下面是视图的预期输出,例如:
ID_ISIN QUOTE_CRNY DESCR RATIO ALLOCATIONASSETTYPE
L000123 USD O 0.0769 Other total
L000129 USD O 0.0669 Other total
D123458 USD O 0.64039 Other total
M123456 USD O 5.64039 Other total
F563458 USD C 0.84039 Other total
G123456 USD null 0.04039 Other total
L000123 USD C 5.0769 Other total
我可以根据此条件创建视图吗?
解决方法
您需要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
在 first 情况下:只需要返回具有i.member_descr = 'O'
个匹配项的member_ratio的最小值。
在第二情况下:告知需要双向(FULL JOIN
)逻辑
对于第三种情况:需要一个{strong>外部联接分别对应于IS_ID_TST
表的位置(在当前情况下为RIGHT JOIN
)连同member_desct
到值'O'
的非等价值(甚至应消除NULL值,并为此目的添加NVL()
函数)>
在这三种情况下指定的所有子查询都应与UNION
组合,以提供逐行组合,包括消除重复的行。
我想出了以下查询,请检查我是否对查询发表了评论。询问是否不符合您的要求或进行任何澄清。
CREATE VIEW v_combined_data AS
WITH combined_data
AS
(
SELECT t1.fund_isin,t1.fund_quote_crny,t1.member_descr,t1.member_ratio,t1.allocationassettype,t2.fund_isin fund_isin_tst,t2.fund_quote_crny fund_quote_crny_tst,t2.member_descr member_descr_tst,t2.member_ratio member_ratio_tst,t2.allocationassettype allocationassettype_tst
FROM is_id t1
FULL OUTER JOIN is_id_tst t2
ON t1.fund_isin = t2.fund_isin
AND t1.fund_quote_crny = t2.fund_quote_crny
AND t1.member_descr = t2.member_descr
)
-- for member_descr = 'O' and for common fund_isin field value from both tables,-- check the member_ratio field and take only the row where member_ratio field value is low.
SELECT d.fund_isin,d.fund_quote_crny,d.member_descr,LEAST(d.member_ratio,d.member_ratio_tst) member_ratio,d.allocationassettype
FROM combined_data d
WHERE d.member_descr = 'O'
AND d.fund_isin IS NOT NULL
AND d.fund_isin_tst IS NOT NULL
UNION ALL
--for member_descr = 'O' and if the fund_isin exist in one table but not in another then take those rows(bidirectional)
--exists in IS_ID and not in IS_ID_TST
SELECT d.fund_isin,d.member_ratio,d.allocationassettype
FROM combined_data d
WHERE d.member_descr = 'O'
AND NOT EXISTS (SELECT 1
FROM combined_data ci
WHERE ci.fund_isin_tst = d.fund_isin
AND ci.fund_quote_crny_tst = d.fund_quote_crny
AND ci.member_descr_tst = 'O')
UNION ALL
--for member_descr = 'O' and if the fund_isin exist in one table but not in another then take those rows(bidirectional)
--exists in IS_ID_TST and not in IS_ID
SELECT d.fund_isin_tst,d.fund_quote_crny_tst,d.member_descr_tst,d.member_ratio_tst,d.allocationassettype_tst
FROM combined_data d
WHERE d.member_descr_tst = 'O'
AND NOT EXISTS (SELECT 1
FROM combined_data ci
WHERE ci.fund_isin = d.fund_isin_tst
AND ci.fund_quote_crny = d.fund_quote_crny_tst
AND ci.member_descr = 'O')
UNION ALL
--for all the rows where member_descr ! = 'O',take all those rows from table IS_ID_TST
SELECT d.fund_isin_tst,d.allocationassettype_tst
FROM combined_data d
WHERE d.fund_isin_tst IS NOT NULL
AND (d.member_descr_tst != 'O' OR d.member_descr_tst IS NULL);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。