Oracle11g 根据另一个表中的行的值重命名一个表的列
例如,我有两个表-表1和表2 表1第Q1、Q2和Q3列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
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
希望这对现在和将来都有帮助。祝你好运。这是一个糟糕的关系设计!您应该更改它。@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)