Oracle数据库中如何将一张表的所有行追加到另一表的每一行?
在Oracle数据库中实现表行的横向追加合并需求
当然可以在Oracle里直接实现这个需求,完全不需要在代码层做两次查询再合并!下面我给你拆解具体的操作方法。
先把你的示例数据整理得更清晰,方便理解:
假设第一张表叫 table1,数据如下:
C1 | C2 | V1 | V2 ---|----|----|---- 1 | A | 3 | 5 2 | B | 4 | 6
第二张表叫 table2,数据是你要追加到每一行的内容:
V1 | V2 ---|---- 3 | 5 4 | 6
你的需求本质是把table2的所有行横向拼接成一组固定列,再追加到table1的每一行后面。
实现方法
核心思路是先将table2的多行数据转换为单行多列(行转列),再与table1做笛卡尔关联(因为每个table1的行都要匹配这组固定列)。
1. 对table2做行转列处理
我们可以用Oracle的PIVOT函数来完成行转列,先给table2的行添加序号,方便区分不同行的列:
SELECT * FROM ( SELECT V1, V2, ROW_NUMBER() OVER (ORDER BY V1) AS row_num FROM table2 ) PIVOT ( MAX(V1) AS v_val, MAX(V2) AS v2_val FOR row_num IN (1 AS first_row, 2 AS second_row) );
这个查询会返回单行结果:
FIRST_ROW_V_VAL | FIRST_ROW_V2_VAL | SECOND_ROW_V_VAL | SECOND_ROW_V2_VAL ----------------|------------------|------------------|------------------- 3 | 5 | 4 | 6
2. 关联table1得到最终结果
把上面的行转查询作为子查询,和table1执行CROSS JOIN(因为子查询仅返回一行,不会产生冗余数据),并指定别名匹配你想要的列名:
SELECT t1.C1, t1.C2, t2_pivot.first_row_v_val AS C3, t2_pivot.first_row_v2_val AS C4, t2_pivot.second_row_v_val AS C5, t2_pivot.second_row_v2_val AS C6 FROM table1 t1 CROSS JOIN ( SELECT * FROM ( SELECT V1, V2, ROW_NUMBER() OVER (ORDER BY V1) AS row_num FROM table2 ) PIVOT ( MAX(V1) AS v_val, MAX(V2) AS v2_val FOR row_num IN (1 AS first_row, 2 AS second_row) ) ) t2_pivot;
执行后就能得到你期望的结果:
C1 | C2 | C3 | C4 | C5 | C6 ---|----|----|----|----|---- 1 | A | 3 | 5 | 4 | 6 2 | B | 3 | 5 | 4 | 6
扩展说明
如果table2的行数不固定,你可以用动态SQL来自动生成对应的列;如果是固定行数,上面的静态SQL就足够使用。另外,CROSS JOIN在这里是安全的,因为子查询只会返回一行,不会产生多余的笛卡尔积结果。
内容的提问来源于stack exchange,提问作者Milorad
相关产品推荐
相关产品推荐

