Ищите предложение: могу ли я избежать UNION ALL в моем запросе? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть таблица с именем SOURCE_TABLE, где 3 столбца относятся к конкретному дню, что означает SUN_W, SUN_WA и SUN_WB для воскресенья и повторяется для понедельника как MON_W, MON_WA и MON_WB и т. Д., И в общей сложности у меня есть 3 x 7 = 21 столбец

Есть ли лучший способ переписать приведенный ниже запрос и избегать UNION ALL?

      SELECT * FROM
      (SELECT 
      /*+ parallel(scr,10)
          parallel(el,10)  */ scr.rowid  AS "row_id", scr.*
      FROM SOURCE_TABLE scr
      LEFT OUTER JOIN CITY el ON (el.CITY_NAME  = scr.SUN_W)
      WHERE (el.ROWID IS NOT NULL AND scr.SUN_W IS NOT NULL
      AND GREATEST(scr.SUN_WA, scr.SUN_WB ) IS NULL)
      OR (el.ROWID IS NULL AND scr.SUN_W IS NOT NULL)

      UNION ALL

      SELECT 
      /*+ parallel(scr,10)
          parallel(el,10)  */ scr.rowid  AS "row_id", scr.*
      FROM SOURCE_TABLE scr
      LEFT OUTER JOIN CITY el ON (el.CITY_NAME  = scr.MON_W)
      WHERE (el.ROWID IS NOT NULL AND scr.MON_W IS NOT NULL
      AND GREATEST(scr.MON_WA, scr.MON_WB ) IS NULL)
      OR (el.ROWID IS NULL AND scr.MON_W IS NOT NULL)


      UNION ALL

      SELECT 
      /*+ parallel(scr,10)
          parallel(el,10)  */ scr.rowid  AS "row_id", scr.*
      FROM SOURCE_TABLE scr
      LEFT OUTER JOIN CITY el ON (el.CITY_NAME  = scr.TUE_W)
      WHERE (el.ROWID IS NOT NULL AND scr.TUE_W IS NOT NULL
      AND GREATEST(scr.TUE_WA, scr.TUE_WB ) IS NULL)
      OR (el.ROWID IS NULL AND scr.TUE_W IS NOT NULL)

      UNION ALL 

      ...

      )

1 Ответ

0 голосов
/ 17 октября 2019

Предложение или два, которые могут или не могут помочь. Посмотрите, протестируйте, решите.

Это:

WHERE (    el.ROWID IS NOT NULL 
       AND scr.SUN_W IS NOT NULL
       AND GREATEST(scr.SUN_WA, scr.SUN_WB ) IS NULL
      )
   OR (el.ROWID IS NULL AND scr.SUN_W IS NOT NULL)

выглядит подозрительно для меня. Почему вы проверяете ROWID IS NULL? Это не может быть нулем, не так ли? Следовательно, оно может быть сокращено до

WHERE scr.sun_w is not null 
  AND greatest(scr.sun_wa, scr.sun_wb) is null

Кроме того, GREATEST будет NULL, если один (или оба) из параметров NULL, поэтому тогда будет

WHERE scr.sun_w is not null
  AND (   scr.sun_wa is null 
       OR scr.sun_wb is null
      )

Я не могу сказать, какой из них будет работать лучше. Если greatest работает нормально, оставьте его, хотя это не так очевидно, что вы ищете.


Я не уверен, что это эквивалентно вашему запросу (не могу проверить,нет ваших данных), но - посмотрите, имеет ли это смысл (содержит столбцы до вторника):

select *
from source_table scr left outer join city el 
  on el.city_name in (scr.sun_w, scr.mon_w, scr.tue_w)
where 
  (    scr.sun_w is not null
   and greatest(scr.sun_wa, scr.sun_wb) is null
  )
  or
  (    scr.mon_w is not null
   and greatest(scr.mon_wa, scr.mon_wb) is null
  )
  or
  (    scr.tue_w is not null
   and greatest(scr.tue_wa, scr.tue_wb) is null
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...