sql - 基于两个数据库表之间的数据比较创建oracle View

标签 sql oracle select view

我有下表:

  • 我想创建 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 组合,以提供按行组合,包括消除重复行。

Demo

关于sql - 基于两个数据库表之间的数据比较创建oracle View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64009771/

相关文章:

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 即使第二个表上的行不存在也右连接

sql - 列在 Oracle PL-SQL 中定义不明确

mysql twitter/facebook 喜欢状态提要

sql - 表中唯一字段的索引是否允许立即发生选择计数(*)?如果不是,为什么不呢?

SQL Server、远程存储过程和 DTC 事务

java - Oracle 连接/查询超时

java - Oracle SQL Developer 4.2.0.17.089.1709 无法打开 - 无错误

java - 在弹出窗口中单击微调器会导致 WindowManager$BadTokenException

sql - 不应该在 Sql 中的 SELECT 之前出现吗?