You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:31