Предложение или два, которые могут или не могут помочь. Посмотрите, протестируйте, решите.
Это:
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
);