【问题标题】:Optimize rows to columns conversion优化行到列的转换
【发布时间】:2014-07-24 10:05:50
【问题描述】:

我有一个大的 Oracle 表(大约 4000 万行),如下所示:

ID  Name    Question Answer Reason      
3   Name1   1       Yes     blah blah
3   Name1   2       No      NA
3   Name1   3       No      NA
3   Name1   4       Yes     blah2
3   Name1   5       Yes     null
3   Name1   6       Yes     blah3
3   Name1   7       No      null
6   Name2   1       Yes     blah4444
6   Name2   2       No      null
6   Name2   3       Yes     blah3
6   Name2   4       NA      blah5
6   Name2   5       Yes     null
6   Name2   6       Yes     blah6
6   Name2   7       NA      null

每个 ID 我需要一行,即我需要为每个问题的答案(每个 ID 有 7 个问题)和每个问题的原因添加列。我需要让它看起来像这样:

ID  Name    Q1     Q1-Reason    Q2    Q2-Reason   Q3    Q3-Reason    etc.
3   Name1   Yes    blah blah    No    null      
6   Name2   Yes    blah4444     No    null      

我的查询目前如下所示:

select
   A.ID,A.NAME,B1.Q1,B1.Q1-REASON,B2.Q2,B2.Q2-REASON
from
   TABLENAME A
inner join
    (
    select distinct C1.ID,C1.ANSWER as Q1,C1.REASON as Q1-REASON
    from TABLENAME C1
    where C1.QUESTION=1
    ) B1 on B1.ID=A.ID
inner join
    (
    select distinct C2.ID,C2.ANSWER as Q2,C2.REASON as Q2-REASON
    from TABLENAME C2
    where C2.QUESTION=2
    ) B2 on B2.ID=A.ID
...
...

但是,由于表很大,检索数据需要很长时间。有人可以建议优化此查询的方法吗?

我使用的是 Oracle 10g 和 SQLDeveloper 4.0.2.15

【问题讨论】:

  • 感谢您的评论,马特!我刚刚编辑了问题以包含该信息。

标签: sql performance oracle inner-join


【解决方案1】:

你可以这样做:

SELECT
    TABLENAME.ID,
    TABLENAME.Name,
    MAX(CASE WHEN TABLENAME.Question=1 THEN TABLENAME.Answer ELSE NULL END) AS Q1,
    MAX(CASE WHEN TABLENAME.Question=1 THEN TABLENAME.Reason ELSE NULL END) AS Q1_Reason,
    MAX(CASE WHEN TABLENAME.Question=2 THEN TABLENAME.Answer ELSE NULL END) AS Q2,
    MAX(CASE WHEN TABLENAME.Question=2 THEN TABLENAME.Reason ELSE NULL END) AS Q2_Reason,
    MAX(CASE WHEN TABLENAME.Question=3 THEN TABLENAME.Answer ELSE NULL END) AS Q3,
    MAX(CASE WHEN TABLENAME.Question=3 THEN TABLENAME.Reason ELSE NULL END) AS Q3_Reason
/*And so on*/
FROM
    TABLENAME
GROUP BY
    TABLENAME.ID,
    TABLENAME.Name

【讨论】:

  • @Mihai:哎呀。谢谢
  • 嗨,Arion,感谢您抽出时间来回答。我收到“未在预期位置找到 FROM 关键字”错误。你能告诉我我可能做错了什么吗? (我把所有的逗号都弄对了)
  • 我没有看到我回答的 sql 有任何问题。你确定你复制的正确吗?
  • 刚刚想通了!原来你不能在 AS 部分使用连字符。例如:“Max(blahblah) AS blah1-blah2”给出了该错误。再次感谢!
  • @Arion 您在列别名中使用- 而不引用它们。我建议你使用Q1_Reason 而不是Q1-Reason 等。
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2014-07-13
相关资源
最近更新 更多