oracle中如何根据多个表创建表

Posted

技术标签:

【中文标题】oracle中如何根据多个表创建表【英文标题】:how to create table based on multiple table in oracle 【发布时间】:2021-06-24 03:11:51 【问题描述】:

所以我有多个表,我想根据这些多个表中的所有列创建新表。但如果列名重复,则只取 1 列。

我试图创建这样的查询:

CREATE TABLE schema_rr_dmt
  AS (SELECT al.*, rl.*, cs.*  FROM a_loans al INNER JOIN s_CUSTRLTNP rl 
ON al.id_nasabah = rl.id_nasabah INNER JOIN s_customer cs ON cs.id_nasabah = rl.enterprise_id);

但它变成了错误

[Error] Script lines: 8-10 -------------------------
 ORA-00957: duplicate column name
 Script line 9, statement line 2, column 22

如果多个表中的列名相同,如何只取一列

【问题讨论】:

【参考方案1】:

您必须枚举所需的每一列,而不是使用通配符快捷方式。例如,如果表 A_LOANS 和 S_CUSTOMERS 有一个名为 CUSTOMER_ID 的列,那么您将需要明确列出您想要的这两个表中的每一列...

CREATE TABLE schema_rr_dmt
  AS (SELECT al.col1, al.col2, al.CUSTOMER_ID, etc...

顺便说一句,您可以在 CTAS 中包含重复的列,但您需要为其提供一个别名以赋予其唯一名称。

【讨论】:

但是如果一张表中有很多列怎么办?这种方式是手动方式,有没有自动解决这个问题的方法?因为我要删除的只是具有相同名称的列。 你必须这样做。现在您可以针对数据字典编写脚本以生成 CTAS,但您必须生成脚本以省略重复的列或消除它们的歧义【参考方案2】:

如果唯一的重复名称来自join 键,那么using 可以解决您的问题:

CREATE TABLE schema_rr_dmt AS
    SELECT *
    FROM a_loans al INNER JOIN
         s_CUSTRLTNP rl 
         USING (id_nasabah) INNER JOIN
         s_customer cs 
         ON id_nasabah = rl.enterprise_id;

但是,如果有其他重复的列名,这将不起作用。

【讨论】:

根据我的实际情况,有3个表,第一个表是s_custrltnp,有8列,其中一个是kd_cabang,下一个是a_loans,有144列和一个该列是kd_kolek 下一个是s_customer,有63 列,其中有kd_kolekkd_cabang,我想使用inner join 从这些表中取出所有列,我可以using那些重复的列? @FahriDzaky 。 . .正如本文所解释的,这仅在 using 子句中唯一重复的列是 join 键时才有效。【参考方案3】:

问题出在你的SELECT 那里你有al.*, rl.*, cs.* 显然你在* 的某个地方有相同的列名。因此,您不能至少为 1 个,但可能是 2 个表。您需要解决此问题的是展开* 列出所有字段,如al.col1, al.col2 as alCol2。如果只有你的表 rl 也有 col2 现在你没有问题。但如果您的rlcs 至少有col2,则其中一个需要别名。

不过,我建议在这种情况下展开所有列

SELECT ... al.col2 as al_Col2, rl.col2 as rl_Col2, cs.col2 as cs_col2 ...` 

【讨论】:

以上是关于oracle中如何根据多个表创建表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 10g中如何创建表

Oracle 10g中如何创建表

oracle创建数据库和表空间有啥联系?

oracle 创建表空间、创建用户

在oracle数据库中,如何建立表与表之间的关系?

如何根据 Id 从多个表中获取值并根据 id 创建新表