Oracle新手求助:如何用表A和表B创建表C?
Oracle基于表A、表B创建表C的实现思路与代码
根据不同业务需求,常见的创建方式分为以下几种:
1. 关联表A和表B的数据创建表C
如果表A和表B存在关联字段(比如共同的ID),要把两张表的关联数据整合到新表C中,用CREATE TABLE ... AS SELECT(简称CTAS)语句最直接:
示例代码(直接创建带数据的表)
-- 假设A和B通过product_id关联,选择A的所有列+B的指定列创建表C CREATE TABLE C AS SELECT A.*, B.product_name, B.price FROM A INNER JOIN B ON A.product_id = B.product_id;
若需要手动添加约束(比如主键)
如果要给表C加主键、非空等约束,建议先定义表结构再插入数据:
-- 先定义表C的结构和约束 CREATE TABLE C ( order_id NUMBER PRIMARY KEY, customer_name VARCHAR2(100) NOT NULL, order_date DATE, product_name VARCHAR2(50), price NUMBER(10,2) ); -- 插入A和B的关联数据 INSERT INTO C (order_id, customer_name, order_date, product_name, price) SELECT A.order_id, A.customer_name, A.order_date, B.product_name, B.price FROM A INNER JOIN B ON A.product_id = B.product_id;
2. 合并表A和表B的同结构数据
如果表A和表B的字段结构完全一致,要把两张表的所有数据合并到表C中:
示例代码
-- 合并A、B所有数据(保留重复数据用UNION ALL,去重用UNION) CREATE TABLE C AS SELECT * FROM A UNION ALL SELECT * FROM B;
3. 仅复制表A和表B的结构(不含数据)
如果只需要表C拥有A和B的字段结构,不需要数据:
示例代码
-- 创建包含A和B所有字段的空表 CREATE TABLE C AS SELECT A.*, B.* FROM A JOIN B ON 1 = 0; -- 1=0确保不会查询到任何数据
新手注意事项
- 若A和B有同名字段,查询时要加别名区分,比如
A.id AS a_id, B.id AS b_id,避免创建表时列名重复报错 - CTAS创建的表不会继承原表的主键、外键、索引等约束,需要手动添加
- 确保SELECT语句中列的数据类型兼容,避免创建表时出现类型不匹配的错误
内容的提问来源于stack exchange,提问作者Big Dream American
相关产品推荐
相关产品推荐

