我有下表:
- 我想创建 View ,以便对于两个表中的
descr = 'O'
和公共(public)id_isin
字段值,检查ratio
字段并仅采用ratio
字段值较低的行。 - 对于
descr = 'O'
并且如果 id_isin 存在于一个表中但不存在于另一个表中,则获取这些行(双向) - 对于
descr ! 的所有行= 'O'
,从表IS_ID_TST
中获取所有这些行。
以下是 View 的预期输出,例如:
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
我可以根据这个条件创建 View 吗?
最佳答案
您需要 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
对于第一种情况:只需要返回与i.member_descr = 'O'
匹配的member_ratio的最小值。
对于第二种情况:需要双向(FULL JOIN
)逻辑
对于第三种情况:外部联接分别对应于IS_ID_TST
表的位置(在当前情况下,它是RIGHT JOIN
)需要与 member_desct
的非等值(value) 'O'
一起使用(即使是 NULL 值也应该被消除,并且 为此目的添加了 NVL()
函数 )
并且在这三种情况下指定的所有子查询都应该与 UNION
组合,以提供按行组合,包括消除重复行。
关于sql - 基于两个数据库表之间的数据比较创建oracle View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64009771/