Oracle SQL - 为“create as select”添加重复的列名前缀

Posted

技术标签:

【中文标题】Oracle SQL - 为“create as select”添加重复的列名前缀【英文标题】:Oracle SQL - Prefix duplicate column names for 'create as select' 【发布时间】:2014-05-27 23:14:20 【问题描述】:

我认为我之前尝试过以另一种形式 here 提出过我想要实现的目标。但是我有一个稍微不同的要求,并且对我能做什么有更多的限制。

在这个简化的场景中:

CREATE TABLE backup_data AS SELECT a.*, b.*, c.*
FROM tbl_a a, tbl_b b, tbl_c c
WHERE a.aid = b.bid
AND b.cid = c.cid; 

tbl_atbl_btbl_c 有一些列同名,当我尝试运行时,Oracle 将返回列名重复错误。

我希望有某种方法可以区分列名,以便尽管名称相同,我也可以插入它们。

我认为这可能通过连接别名来实现,例如:

CREATE TABLE backup_data AS SELECT a.* 'tbl_a_' || COLUMN_NAME, b.* 'tbl_b_' || COLUMN_NAME, c.* 'tbl_c_' || COLUMN_NAME
FROM tbl_a a, tbl_b b, tbl_c c
WHERE a.aid = b.bid
AND b.cid = c.cid; 

恐怕我已经知道唯一的解决方案是:

    收拾一下,用适当的别名手工写出 617 个列名,或者 使用一些很棒的 PLSQL

不幸的是,在这个特定的例子中我没有 PLSQL 的奢侈,我也没有时间手工完成。

有没有其他方法可以实现这个创建为具有重复列名的选择?

【问题讨论】:

同名的列是你加入的列吗?或者是否有不属于连接的其他列具有相同的名称?通常,SELECT 语句可以愉快地返回多个具有相同名称的列,Oracle 可以为第二列隐式提供适当的别名。我假设对唯一别名的要求来自您对select 的结果所做的任何事情。您显示的 insert as select 不是有效的 SQL 语法 - 也许您真的在做 CREATE TABLE AS SELECT 对不起,你是对的我正在尝试创建为选择...我已经重构了 OP。按照我提到的方式,有没有更好的方法来做到这一点? 同名的列是你加入的列吗?或者是否存在不属于连接但名称相同的其他列? 是的,有同名的连接列,也有大量的非连接重名。 【参考方案1】:

您的选择:

    忍住(你已经记对了!) 使用 pl/sql 动态生成语句“询问”oracle 系统视图。 使用混合方法 - 动态生成 STATIC 语句(或列列表)。

例如 - 我有 output_file 表。它有 100 多列。

select TABLE_NAME , LISTAGG(COLUMN_NAME||'1',',') WITHIN GROUP (ORDER BY COLUMN_NAME) AS COL_NAME from user_tab_cols where table_name = 'OUTPUT_FILE'
 GROUP BY TABLE_NAME;

注意事项: 您注意到“交叉”表时有很多同名的列,所以当生成列列表时,我添加了“1”,所以下一个表将有“2”等等。 您还需要正确设置客户端的屏幕,以确保生成的列表不会被截断。在 SQL+ 上是

COL COL_NAME FORM A400

(这是为我的示例设置的) 假设:listagg 在 11g Rel 2 上可用。 类似的技巧可用于 10g 和 11.1。 如果需要对旧数据库的帮助,请告诉我。

【讨论】:

以上是关于Oracle SQL - 为“create as select”添加重复的列名前缀的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中SQL语句查询的问题,分类统计汇总为和

从 Oracle 转换为 SQL Server

oracle sql语句 若某字段为空则更新此字段否则更新另一个字段,只用一个sql语句

sql 将现有Oracle表反向工程为Quick SQL

将 SQL 转换为 Oracle 设置参数 [重复]

sql 为Oracle编写的SQL代码,显示销售订单行信息。