Oracle11g 根据另一个表中的行的值重命名一个表的列

Oracle11g 根据另一个表中的行的值重命名一个表的列,oracle11g,toad,Oracle11g,Toad,例如,我有两个表-表1和表2 表1第Q1、Q2和Q3列 Q1 Q2 Q3 Map_id 11 23 34 11101 22 22 22 11102 表2列为refvalue、actualvalue refvalue actualvalue Map_id Q1 Remaining 11101 Q2 Utilized 11101 Q3 Actual 11101 Q1 Rema

例如,我有两个表-表1和表2

表1第Q1、Q2和Q3列

Q1  Q2  Q3 Map_id
11  23  34  11101
22  22  22  11102 
表2列为refvalue、actualvalue

refvalue    actualvalue     Map_id
    Q1  Remaining           11101
    Q2  Utilized        11101
    Q3  Actual          11101
    Q1  Remaining1      11102
    Q2  Utilized1   11102
    Q3  Actual1 11102
现在我想将表1的列名称替换为表2中相应的值

例如:

select Q1 as "Remaining", Q2 as "Utilized", Q3 as "Actual"
from Table1;
这是硬编码的,如何使其符合逻辑?我不知道如何处理这个问题,我是oracle的新手

版本:Oracle11g
客户:Toad

虽然这是一个非常糟糕的关系设计,我建议您更改它,但可以使用
PL/SQL
完成,类似这样的操作:(可能会稍微调整一下)

这将生成所需的sql

  • 创建一个日志表,DDL_log_选项卡
  • 使用隐式游标遍历表2中的记录
  • 对于表2中的每条记录,构建一条字符串语句,“ALTERTABLE1将列rec.REFWALUE重命名为rec.ACTUALLVALUE”,其中rec引用隐式游标中的每条记录
  • 在循环内部,将生成的每个语句插入DDL_LOG_选项卡
  • 现在,在新的DDL_日志_选项卡中有了所有必需的DDL。只需选择SQL并将其作为动态SQL执行即可

    您甚至可以临时创建这个新表来保存执行时间戳(开始和结束TS)、错误消息或成功标志。以后你可以用这张桌子

    a。生成和执行任何类型的DDL。 B参考过去按时间顺序执行的DDL历史。 C如果出现任何DDL错误并停止执行,您可以修复错误并从故障点重新启动执行


    希望这对现在和将来都有帮助。祝你好运。

    这是一个糟糕的关系设计!您应该更改它。@sagi-这是业务需求。我们不能改变它。这就是客户端遗留系统的现状,他们不希望它改变。你能帮我解决这个问题吗?所以你应该为relations添加另一列,这将在将来引发很多错误!这可以通过
    PL/SQL
    来完成,但是如果不能正确地连接表,这将是一段很长的代码,而且代码不可读@对不起,我又错过了一个细节。在问题中添加了他没有要求更改列名的内容,他要求选择它们作为,这并没有给出列的值。无论如何,我也更新了这个问题。@AnkurVerma这不应该带来值,它生成的输出是一个sql代码,您需要复制和执行,然后您就可以得到所需的输出。
    select 'SELECT Q1 as '||MAX(CASE WHEN t2.ref_value = 'Q1' THEN t2.actual_value END)||',
                   Q2 as '||MAX(CASE WHEN t2.ref_value = 'Q2' THEN t2.actual_value END)||',
                   Q3 as '||MAX(CASE WHEN t2.ref_value = 'Q3' THEN t2.actual_value END)
            ||'FROM Table1'
    FROM Table1 t1
    INNER JOIN Table2 ON(1=1)