Oracle SQL-为“按选择方式创建”添加重复列名前缀

Oracle SQL-为“按选择方式创建”添加重复列名前缀,sql,oracle,duplicates,alias,columnname,Sql,Oracle,Duplicates,Alias,Columnname,我想我正在努力实现的目标以前有人以另一种形式问过我。但我有一个稍微不同的要求和更多的限制,我可以做什么 在这个简化的场景中: 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_a、tbl_b和tbl_c的某些列具有相同的名称,当我尝试运行它时,Oracle将返回重复的列名错误 我所希望的是,有某种方

我想我正在努力实现的目标以前有人以另一种形式问过我。但我有一个稍微不同的要求和更多的限制,我可以做什么

在这个简化的场景中:

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_a、tbl_b和tbl_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,也没有足够的时间手工操作

是否有其他方法可以使用重复的列名创建为选择?

您的选项:

吸起来你已经记对了! 使用pl/sql动态生成查询oracle系统视图的语句。 使用混合方法-动态生成静态语句或列列表。 例如,我有一个输出文件表。它有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
这就是我的榜样 假设:Listag在11g Rel 2上可用。 在10g和11.1上也可以使用类似的技巧。
如果需要旧数据库的帮助,请告诉我。

名称相同的列是否就是您要加入的列?或者是否有其他列不是具有相同名称的联接的一部分?通常,SELECT语句可以愉快地返回具有相同名称的多个列,Oracle可以隐式地为第二列提供适当的别名。我假设对唯一别名的要求来自于您对select结果所做的任何操作。您正在将insert显示为select,这不是有效的SQL语法-也许您真的正在将CREATE TABLE显示为select?很抱歉,您是对的,我正在尝试将其创建为select。。。我已经重构了OP。有没有比我提到的更好的方法呢?同名的列是否就是您要加入的列?或者是否有其他列不是具有相同名称的联接的一部分?是的,存在具有相同名称的联接列以及大量非联接重复名称。