【问题标题】:Oracle SQL - Prefix duplicate column names for 'create as select'Oracle SQL - 为“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; 

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

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

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

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

【问题讨论】:

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

标签: sql oracle duplicates alias columnname


【解决方案1】:

您的选择:

  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。 如果需要对旧数据库的帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 2021-05-16
    • 2022-01-13
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多