首页 > 解决方案 > 在 Oracle 中合并两个结果集

问题描述

假设我们有 2 个选择结果:A 和 B:

所以 A 就像:

KEY VALUE
1     v1
1     v2

B 很简单:

KEY VALUE
1    v3

我需要合并这些集合KEY以获得这样的结果:

A.KEY A.VALUE B.KEY B.VALUE
1        v1     1      v3
1        v2     null   null       

唯一想到的 - 使用full join如下:

select A.*, B.*
from A
full join B on B.KEY = A.KEY

显然,它会导致不希望的结果:

A.KEY A.VALUE B.KEY B.VALUE
1        v1     1      v3
1        v2     1      v3 

Oracle 中是否有任何选项可以执行所需的操作?

PS 这些只是指出问题的示例——将较小的结果集合并到较大的结果集,用null. 真实的AB更大,大小未知。我们不能VALUE以某种方式引用列 - 它的内容也是未知的。

标签: sqloracle

解决方案


您可以使用row_number()枚举行并将其包含在join条件中:

select A.*, B.*
from (select a.*, row_number() over (partition by key order by key) as seqnum
      from a
     ) a full join
     (select  b.*, row_number() over (partition by key order by key) as seqnum
      from b
     ) a full join
     on b.k a.key and b.seqnum = a.seqnum;

或删除用于的重复列名join

select *
from (select a.*, row_number() over (partition by key order by key) as seqnum
      from a
     ) a full join
     (select  b.*, row_number() over (partition by key order by key) as seqnum
      from b
     ) a full join
     using (key, seqnum);

推荐阅读