Исключение ЛЕВЫХ НАРУЖНЫХ СОЕДИНЕНИЙ в Oracle SQL ЗАПРОС, если КОЛОННА на базовой таблице = 'N' - PullRequest
0 голосов
/ 17 февраля 2020

Ниже вы увидите простой оператор JOIN из 5 базовых таблиц, я пытаюсь исключить две таблицы операторов LEFT OUTER JOIN ( dandm_emi_cae_statement_links, geod_us_cae_statement_links ) из оператора SQL, если столбец geod_exclude_us_y в таблице JMD_UDG_DISTRIBUTION равно 'N'.

В настоящее время приведенный ниже оператор в SQL PLAN по-прежнему просматривает эти таблицы, как я могу остановить его от выполнения LEFT OUTER JOIN ', если таблица JMD_UDG_DISTRIBUTION column geod_exclude_us_y = 'N' ?

SELECT lfu.*
FROM JMD_UDG_DISTRIBUTION jud  
JOIN dm_lifeline_file_usages lfu 
    ON  lfu.group_id = jud.GROUP_SURR_ID 
JOIN dm_lifeline_file_ips lfi 
    ON  lfi.usage_group_id = lfu.group_id 
    AND lfi.lfu_surr_id = lfu.surr_id 
LEFT OUTER JOIN dandm_emi_cae_statement_links dnm 
    ON  jud.geod_exclude_us_y = 'Y' 
    AND dnm.cae=lfi.cae_number 
LEFT OUTER JOIN geod_us_cae_statement_links gucs 
    ON  jud.geod_exclude_us_y = 'Y' 
    AND gucs.cae_number=lfi.cae_number

1 Ответ

0 голосов
/ 17 февраля 2020

Конечно. Правила для LEFT JOIN:

  • Все строки, которые соответствуют условию ON.
  • Все строки в таблице first , если нет совпадение во втором.

Итак, условие для таблицы first в ON не влияет на результаты. Это не совсем верно. Там есть странный вид воздействия. Столбцы из второй таблицы - даже для строк, совпадающих по-другому - NULL.

Итак, вы хотите выполнить фильтрацию в предложении WHERE. Переместите jud.geod_exclude_us_y = 'Y' из предложений ON в:

WHERE jud.geod_exclude_us_y = 'Y'
...