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_kolek
和kd_cabang
,我想使用inner join
从这些表中取出所有列,我可以using
那些重复的列?
@FahriDzaky 。 . .正如本文所解释的,这仅在 using
子句中唯一重复的列是 join
键时才有效。【参考方案3】:
问题出在你的SELECT
那里你有al.*, rl.*, cs.*
显然你在*
的某个地方有相同的列名。因此,您不能至少为 1 个,但可能是 2 个表。您需要解决此问题的是展开*
列出所有字段,如al.col1, al.col2 as alCol2
。如果只有你的表 rl
也有 col2
现在你没有问题。但如果您的rl
和cs
至少有col2
,则其中一个需要别名。
不过,我建议在这种情况下展开所有列
SELECT ... al.col2 as al_Col2, rl.col2 as rl_Col2, cs.col2 as cs_col2 ...`
【讨论】:
以上是关于oracle中如何根据多个表创建表的主要内容,如果未能解决你的问题,请参考以下文章