sql - Oracle - 根据不同来源的不同行数进行减法

标签 sql oracle

我基本上有 3 个不同的 select 语句,它们根据键检索不同数量的行。我想做减法,这样就不会丢失任何记录。即使这 2 个 select 语句返回 null,我仍然会通过将它们设置为 0 来进行减法。

例如,

SELECT COL1, COL2,COL3, (C.EXP_VAL + (A.EXP_VAL-B.EXP_VAL)) AS EXP_VAL FROM 
(SELECT * FROM A WHEN KEY = 1 AND CATE_TYPE=1) A, \\ RETURNS 5 ROWS
(SELECT * FROM B WHERE KEY =1 AND CATE_TYPE=2) B, \\ RETURNS 5 ROWS
(SELECT * FROM C WHERE KEY=1 AND CATE_TYPE=3) C \\RETURNS 10 ROWS
WHERE A.KEY=B.KEY AND A.KEY=C.KEY AND A.COL1=B.COL1 AND A.COL1=C.COL1;

在上面的示例中,我看到的是,由于 WHERE 子句条件,最终结果仅返回 5 条记录的较小子集。我如何能够检索所有 10 条记录而不是较小的子集。理想情况下,我想要的是 10 条记录,那些与 WHERE 子句匹配的记录由 (+,-) 进行评估,而那些不匹配的记录也通过设置为 0 进行评估。如果C有记录而A,B没有,则为c.exp_val + (0-0),A,B设置为0。

最佳答案

您可以使用完全外部联接:

SELECT COL1, COL2, COL3, (C.EXP_VAL + (A.EXP_VAL-B.EXP_VAL)) AS EXP_VAL
FROM (SELECT * FROM A WHEN KEY = 1 AND CATE_TYPE=1) A full outer join
     (SELECT * FROM B WHERE KEY =1 AND CATE_TYPE=2) B
     ON A.KEY = B.KEY AND
        A.COL1 = B.COL1 full outer join
     (SELECT * FROM C WHERE KEY=1 AND CATE_TYPE=3) C 
     ON C.KEY = COALESCE(A.KEY, B.KEY) AND
        C.COL1 = COALESCE(A.COL1, B.COL1);

如果您知道第三个子查询始终具有最多的行,则可以重新排列子查询并使用LEFT JOIN

此外,切勿在 FROM 子句中使用逗号。始终使用显式的JOIN

另请注意,不匹配表中的值将为 NULL,而不是 0。如果您想要 0,请使用 COALESCE()

关于sql - Oracle - 根据不同来源的不同行数进行减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31382290/

相关文章:

mysql - SQL:列必须出现在 GROUP BY 子句中或在聚合函数中使用

sql - 是否可以在兼容oracle的sql中比较元组?

java - DatabaseMetaData.getTables() 返回多少列?

sql - 获取 LEFT OUTER JOIN 的第一行

sql - 相同的数学逻辑,不同的结果?

sql - 使用子字符串与使用通配符的 SQL 比较的性能

sql - BigQuery - 连接谓词中不支持带表的子查询

mysql - 列出每条记录出现的次数 SQL

ruby - 链接到 OS X 上特定的 Oracle 即时客户端动态库

php - Else 语句在选项选择中不起作用