如何重写以摆脱select子句中的子查询

时间:2013-11-21 14:47:40

标签: sql oracle subquery

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(+)

1 个答案:

答案 0 :(得分: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