甲骨文联盟将Oracle的两个记录合并为一个记录

问题描述

我创建了两个简单的查询,以使用UNION合并记录

但是,在一种情况下,我遇到了一个问题,第一个表中的数据与第二个表中的数据完全一样

然后结果出现在一个记录中,而不是两个记录,因为其他记录我需要在单独的行中显示

例如,我有两个用于银行的表

BankAccount1和BankAccount2

select ID,REF,Amount 
from
    (select ID1,REF1,Amount1 from BankAccount1 
     Union
     ID2,REF2,Amount2 from BankAccount2)

结果应为:

ID    REF         Amount
------------------------
1     10101040      200
1     10101040      200

但是Oracle显示出这样的结果

ID    REF        Amount
-------------------------
1     10101040     200

您建议如何解决此问题?

解决方法

摘自The UNION [ALL],INTERSECT,MINUS Operators文档:

UNION操作符仅返回出现在任一结果中的不同行,而UNION ALL操作符返回所有行。 UNION ALL运算符不会消除重复的选定行

因此,您需要使用UNION ALL而不是UNION

SELECT ID1 AS id,REF1 AS ref,Amount1 AS amount
FROM   BankAccount1 
UNION ALL
SELECT ID2,REF2,Amount2
FROM   BankAccount2

因此,对于您的示例数据:

CREATE TABLE bankaccount1 ( id1,ref1,amount1 ) AS
SELECT 1,10101040,200 FROM DUAL;

CREATE TABLE bankaccount2 ( id2,ref2,amount2 ) AS
SELECT 1,200 FROM DUAL;

这将输出:

ID |      REF | AMOUNT
-: | -------: | -----:
 1 | 10101040 |    200
 1 | 10101040 |    200

db 提琴here

(注意:您的查询在语法上无效,因为您需要在SELECT之后加上UNION,并且列名将从{{ 1}}和外部SELECT会期望使用列UNIONSELECTID1而不是REF1Amount1,{{1} }。)

,

使用union all,因为union返回不同的行:

select ID1,REF1,Amount1 from BankAccount1 
Union all
select ID2,Amount2 from BankAccount2