1

我认为我想要达到的目标之前在这里以另一种形式被问过。但是我有一个稍微不同的要求,并且对我能做什么有更多的限制。

在这个简化的场景中:

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_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; 

我担心我已经知道唯一的解决方案是:

  1. 把它吸起来,用适当的别名手工写出 617 列名或
  2. 使用一些很棒的 PLSQL

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

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

4

1 回答 1

2

您的选择:

  1. 把它吸起来(你已经正确地注意到了!)
  2. 使用 pl/sql 动态生成语句“询问”oracle 系统视图。
  3. 使用混合方法 - 动态生成 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 上使用。如果需要对旧数据库的帮助,请告诉我。

于 2014-05-28T03:37:51.523 回答