Oracle SQL:从列名来自另一个表的列获取值

时间:2014-05-12 15:12:34

标签: sql plsql oracle-sqldeveloper

说我有Table1列:id1, name, column_name
还有Table2个列:id2, id1 (fk), col1, col2, col3, ..., colN

这只是我正在寻找的一个简单的例子。实际上,这两个表之间有多个表。

Table1下的column_name中的值是字符串值"col1", "col2", "col3", ..., "colN"

基本上,我想要一个select语句,用"col1", "col2", ...中的第1列,第2列,......的实际值替换字符串Table2

感谢。

2 个答案:

答案 0 :(得分:1)

如果您知道架构并准备对所有可能的列名进行硬编码,那么您可以使用case语句对其进行强制执行:

select case lower(t1.column_name)
    when 'col1' then col1
    when 'col2' then col2
    when 'col3' then col3
    ...
    when 'coln' then coln
  end as result
from table1 t1
join table2 t2 on t2.id1 = t1.id1
where t1.id1 = 1;

如果您需要它更灵活,那么您需要使用动态SQL。你说你想要显示它,并且你已经用SQL Developer标记了这个问题,所以这可能意味着在SQL Worksheet脚本输出窗口中输出 - 你可以使用dbms_output

set serveroutput on
declare
  l_id1  number := 1;
  l_column_name table1.column_name%type;
  l_cur_sql varchar2(80);
  l_cur sys_refcursor;
  l_result number;
begin
  select column_name into l_column_name from table1 where id1 = l_id1;
  l_cur_sql := 'select ' || l_column_name || ' from table2 '
    || 'where id1 = :id1';
  open l_cur for l_cur_sql using l_id1;
  loop
    fetch l_cur into l_result;
    exit when l_cur%notfound;
    dbms_output.put_line(l_result);
  end loop;
  close l_cur;
end;
/

或者您可以使用SQL * Plus / SQL Developer绑定变量处理来简化游标处理而不依赖于dbms_output

var cur refcursor;
var id number;
exec :id := 1;

declare
  l_column_name table1.column_name%type;
  l_cur_sql varchar2(80);
begin
  select column_name into l_column_name from table1 where id1 = :id;
  l_cur_sql := 'select ' || l_column_name || ' from table2 '
    || 'where id1 = :id1';
  open :cur for l_cur_sql using :id;
end;
/

print cur

他们真的都在做同样的事情。您将列名称从table1获取到本地变量,并使用它创建动态SQL语句以从table2中选择该列。您可以通过直接创建动态SQL语句table1查询:

来进一步简化它
declare
  l_cur_sql varchar2(80);
begin
  select 'select ' || column_name || ' from table2 ' || 'where id1 = :id1'
  into l_cur_sql
  from table1
  where id1 = :id;

  open :cur for l_cur_sql using :id;
end;
/

但我认为它分两个阶段会更清晰。

答案 1 :(得分:0)

下面的选择将按表1上的主键和表2上的外键连接表。 select * from table1 inner join table2 on table1.id1 = table2.id1;

如果我明白了,下一步是用另一个表中的数据替换数据。

为此你可以制作剧本。

我整数;

开始

for i in(select * from table1 inner join table2 on table1.id1 = table2.id1)loop

update table1
   set table1.col1 = i.col2
 where id1         = i.id1;

结束循环;

端;

当然,您必须根据您的情况更改此声明。