我基本上有 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/