【问题标题】:How to rewrite to get rid of the subquery in the select-clause [closed]如何重写以摆脱选择子句中的子查询[关闭]
【发布时间】:2013-11-21 14:47:39
【问题描述】:
Select
Xyz,
CASE
    WHEN 'AEJ-DODGE-AC-'
      ||measure IN
      (SELECT child
      FROM interim_dim_measures_mas
      WHERE child LIKE 'AEJ-DODGE-AC%'
        CONNECT BY prior child = parent
        START WITH parent      = 'Total Revenue (GBS).1'
      )
    THEN -1*CAST(datavalue AS FLOAT)
    ELSE CAST(datavalue AS FLOAT)
  END AS amount
FROM interim_data_misbaej,
  w_csrbrd
WHERE LENGTH(period) = 3
AND 'AEJ-BK-'
  || book = region_book(+)

【问题讨论】:

  • 这是一种非常不寻常的语法。你想用 || 来完成什么?建造?另外,为什么有子查询是个问题?最后,您现有的查询现在真的有效吗?
  • 那个'||'部分不重要;子查询被执行5亿次并杀死性能的问题;表 interim_data_misbaej 有 450 万行, w_csrbrd 有 5000 行;所以想知道从选择子句中删除该子查询的等效 sql
  • 好的,我发现这是一个 Oracle 问题,我没有资格提供非常有用的帮助。但我确实修复了标签,所以也许其他人会拿起它。

标签: sql oracle subquery


【解决方案1】:

您可以使用 LEFT JOIN 强制它只运行一次,并使用 GROUP BY 和 COUNT 来确定是否找到了匹配项:

Select Xyz, 
       CASE
         WHEN COUNT(m.child) THEN -1*CAST(datavalue AS FLOAT)
         ELSE CAST(datavalue AS FLOAT)
       END AS amount
FROM interim_data_misbaej, w_csrbrd
LEFT JOIN (
  SELECT child
  FROM interim_dim_measures_mas
  WHERE child LIKE 'AEJ-DODGE-AC%'
    CONNECT BY prior child = parent
    START WITH parent      = 'Total Revenue (GBS).1'
  ) m ON ('AEJ-DODGE-AC-' || measure) = m.child
WHERE LENGTH(period) = 3
  AND 'AEJ-BK-' || book = region_book(+)
GROUP BY Xyz, measure, datavalue

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多