gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:54:25 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com