Oracle SQL查询: pivot table with dynamicly filled for in (advanced)

标签 oracle dynamic pivot

我需要展平一个表,但这里是棘手的部分,clomuns 是动态的,并且当添加包含新 ID 的新记录时查询应该可以工作。

这是我的工作查询(简化了 IN 这实际上是数百个值):

SELECT *
FROM   (select qv.respnr, sq.question_id, qv.question_value
from survey_question sq, question_values qv
where qv.question_id = sq.question_id
and sq.survey_id = 1
order by qv.respnr, page, ranked)
PIVOT (
MAX(question_value)        --<-- pivot_clause
FOR question_id          --<-- pivot_for_clause
IN (346 as c346,347 as c347)
)

我想将 IN (346 as c346,347 as c347) 替换为如下内容:

SELECT mq.question_id
  FROM meta_question mq, survey_question sq2
 WHERE sq2.survey_id = 1
   AND mq.question_id = sq2.question_id
 ORDER BY page, ranked

知道如何做到这一点吗?

我注意到 IN 不能简单地用 select 语句来归档,所以这不起作用:

IN (SELECT mq.question_id
      FROM meta_question mq, survey_question sq2
     WHERE sq2.survey_id = 1
       AND mq.question_id = sq2.question_id
     ORDER BY page, ranked)

最佳答案

编译时需要知道SQL中所有列的名称和类型,这里你必须使用dynamic SQL因为您希望列数根据数据而改变。

如果您使用 PL/SQL,则可以使用 ref cursor :

DECLARE
   l_rc            SYS_REFCURSOR;
   l_dynamic_query VARCHAR2(32000);
BEGIN
   FOR cc IN (SELECT mq.question_id
                FROM meta_question mq, survey_question sq2
               WHERE sq2.survey_id = 1
                 AND mq.question_id = sq2.question_id
               ORDER BY page, ranked) LOOP
      -- build dynamic query here
   END LOOP;
   OPEN l_rc FOR '
      SELECT *
        FROM (SELECT qv.respnr, sq.question_id, qv.question_value
                FROM survey_question sq, question_values qv
               WHERE qv.question_id = sq.question_id
                 AND sq.survey_id = 1
               ORDER BY qv.respnr, page, ranked) 
               PIVOT ( MAX (question_value) --<-- pivot_clause
                       FOR question_id --<-- pivot_for_clause
                        IN (' || l_dynamic_query || ')
                      )';
    -- process l_rc (LOOP..FETCH..CLOSE)
END;

您还可以使用DBMS_SQL .

关于Oracle SQL查询: pivot table with dynamicly filled for in (advanced),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15092625/

相关文章:

c# - 使用大型 CLOB 从 C# 调用存储过程时出现问题

html - 使用 Dart 编辑 CSS

r - Shiny 的 renderUI 只显示最后的输出

c# - 类型为 ‘dynamic’ 的表达式在运行时的行为方式是否应与相同运行类型时间的非动态表达式相同?

sql - mysql查询题,搞不懂

python - Pandas 排序 pivot_table 或分组数据框?

sql - 检查十个字段中的任意两个是否不同(不是 NULL 或相等)

oracle - 不能在 CREATE TABLE 中使用内联约束

tsql - SQL Server 2008 - 将多值列拆分为具有唯一值的行

java - ojdbc6.jar 和 ojdbc14.jar 有什么区别?