我必须编写一个如下的查询。我尝试过,但写不出来。请帮助我。
我有一个返回以下结果集的表。
select *
from table1; --(rowid and ColumnName are columns of the table)
输出:
rowid ColumnName
------------------------------
1 Segment1
2 Segment2
我有另一个表,其结构如下:(Segment1 和 Segment2 是此处的列)
select *
from table2;
输出:
appId Segment1 Segment2 Segment3
---------------------------------------------
a1 fld1 fld2 per
a2 cmp1 hcd4 klp
我需要编写一个查询,该查询从第一个表中读取“ColumnName”值并检索第二个表中的列值。
这意味着,从表 1 中,我将知道表 2 中的可用列是什么,从表 2 中,我将知道针对这些列存储的数据是什么。
如果我不清楚,请告诉我。 此查询位于 Oracle SQL 中
最佳答案
正如评论中提到的,您需要一个带有动态 sql 的 PLSQL block 。请参阅下面的示例:
表格:
create table table1 (row_id number,
ColumnName varchar2(100))
create table table2 (appId number,
Segment1 varchar2(100),
Segment2 varchar2(100),
Segment3 varchar2(100));
Insert all
into TABLE1 (ROW_ID, COLUMNNAME) Values (1, 'Segment1')
into TABLE1 (ROW_ID, COLUMNNAME) Values (2, 'Segment2')
into TABLE2 (APPID, SEGMENT1, SEGMENT2, SEGMENT3) Values (1, 'RRR', 'KKK', 'MMM')
into TABLE2 (APPID, SEGMENT1, SEGMENT2, SEGMENT3) Values (2, 'ZZZ', 'PPP', 'QQQ')
into TABLE2 (APPID, SEGMENT1, SEGMENT2, SEGMENT3) Values (3, 'LLL', 'NNN', 'DDD')
select * from dual;
代码:
DECLARE
var VARCHAR2 (1000);
v_sql VARCHAR2 (2000);
TYPE x_var IS TABLE OF VARCHAR2(1000);
z_var x_var;
num number:=0;
BEGIN
FOR rec IN ( SELECT DISTINCT columnname
FROM table1
ORDER BY 1)
LOOP
num := num +1;
if num = 1 then
var:= rec.columnname;
else
var := var || ' || '' , ''||' || rec.columnname;
end if;
END LOOP;
var := RTRIM (LTRIM (var, ','), ',');
v_sql := 'select '|| var ||' from table2';
EXECUTE IMMEDIATE v_sql BULK COLLECT INTO z_var;
FOR i IN 1 .. z_var.COUNT
LOOP
DBMS_OUTPUT.put_line (z_var(i));
END LOOP;
END;
输出:
SQL> /
RRR , KKK
ZZZ , PPP
LLL , NNN
关于sql - 需要有关使用动态列编写 SQL 查询的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41633149/