我想我所要达到的目标以前已经有人以另一种形式问过我了,但是我有一个稍微不同的要求,对我能做的事情有更多的限制。
在这个简化的场景中:
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;
恐怕我已经知道唯一的解决办法是:
1.吸取教训,用适当的别名手工写出617个列名,或者
1.使用一些很棒的PLSQL
不幸的是,在这个特定的示例中,我没有PLSQL,也没有足够的时间手工完成它。
有没有其他方法可以实现这个创建为选择重复的列名?
1条答案
按热度按时间368yc8dk1#
您的选择:
1.你已经正确地注意到了!
1.使用pl/sql动态生成“询问”oracle系统视图的语句。
1.使用混合方法-生成STATIC语句(或列列表)DYNAMICALLY。
例如,我有一个output_file表,它有100多个列。
注意事项:你注意到,有很多列具有相同的名称时,“交叉”表,所以当列的列表生成,我添加了“1”,所以下一个表将有“2”等。你还需要适当地设置您的客户端屏幕,以确保生成的列表不被截断。在SQL+上,它将是
(that是为我的例子设置的)假设:listagg可以在11 g版本2上使用。类似的技巧可以在10 g和11.1上使用。如果需要一些旧数据库的帮助,请告诉我。