sql - 需要有关使用动态列编写 SQL 查询的帮助

标签 sql oracle

我必须编写一个如下的查询。我尝试过,但写不出来。请帮助我。

我有一个返回以下结果集的表。

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/

相关文章:

javascript - html5数据库将'?!&等作为特殊字符保存在html5数据库中

mysql - 需要获取oracle表中第一次出现和第二次出现之间的记录数

oracle - 如何开始学习 oracle 表格和报告?

sql - Oracle 其中 'TEXT' 按一定百分比匹配某些内容

.net - 坏图像格式异常。这将在安装了 32 位 Oracle 客户端组件的 64 位模式下运行时发生

PHP if 和 while 语句无法正常工作

java - 将嵌套 sql 查询转换为 jpa/hibernate

mysql - 如何从MySQL中的多个表中删除?

sql - 将句子中的单词替换为另一个表中的单词

sql - 什么是动态 SQL 查询?何时需要使用动态 SQL 查询?