Oracle: если таблица левого объединения не возвращает строк, то перейдите к другой таблице левого объединения

#oracle #left-join

#Oracle #левое соединение

Вопрос:

У меня есть два запроса, как показано ниже, и оба они работают хорошо. Теперь мне нужно их объединить, и если первый выбирает find rows, тогда нет необходимости запускать второй select

1.

 select f.*, o.org_sn, ttt.name linkman_name, ttt.phone phone_num
from td_archive_feedback f
         left join TD_SM_ORG o
                   on f.recv_org_id = o.org_id
         left join (--if this select returns no row , then change.if find matching rows then don't change
                    select wm_concat(linkman_name) name,
                           wm_concat(phone_num) phone,
                           org_id
                    from (select linkman_name, phone_num, LINK_ORG_ID, org_id
                          from TD_SM_LINKMAN
                          where STATE = '2'
                            and (LINK_ORG_ID = #link_org_id)) t
                    group by org_id) ttt
                   on ttt.org_id = o.org_id
                   --
         left join td_sm_dict_item di
                   on o.org_level = di.item_id
where f.businessid = #businiessid
  
 select f.*, o.org_sn, ttt.name linkman_name, ttt.phone phone_num
from td_archive_feedback f
         left join TD_SM_ORG o
                   on f.recv_org_id = o.org_id
         left join (--if the first left join return no rows ,then change to this 
                    select wm_concat(linkman_name) name,
                           wm_concat(phone_num) phone,
                           t.org_id
                    from (
                        select linkman_name, phone_num, LINK_ORG_ID, org_id
                          from TD_SM_LINKMAN
                          where STATE = '2'
                            and (LINK_ORG_ID is null or LINK_ORG_ID = '')) t
                    group by t.org_id) ttt
                   on ttt.org_id = o.org_id
                      --
         left join td_sm_dict_item di
                   on o.org_level = di.item_id
where f.businessid = #businessid;
  

Как я и заметил, если

 select wm_concat(linkman_name) name,.... where  STATE = '2'
                            and (LINK_ORG_ID = #link_org_id)) t
  

… не возвращает строк,

Я хочу изменить это на:

 select  wm_concat(linkman_name) name,.... where  STATE = '2' and (LINK_ORG_ID is null or LINK_ORG_ID = '')) t.
  

Пожалуйста, помогите мне, спасибо.

Ответ №1:

Использование или условие:

 select f.*, o.org_sn, ttt.name linkman_name, ttt.phone phone_num
from td_archive_feedback f
         left join TD_SM_ORG o
                   on f.recv_org_id = o.org_id
         left join (--if this select returns no row , then change 
                    select wm_concat(linkman_name) name,
                           wm_concat(phone_num) phone,
                           org_id
                    from (select linkman_name, phone_num, LINK_ORG_ID, org_id
                          from TD_SM_LINKMAN
                          where STATE = '2'
                            and (
                            (LINK_ORG_ID = #link_org_id) or
                             (LINK_ORG_ID is null or LINK_ORG_ID = '')
                             ) t
                    group by org_id) ttt
                   on ttt.org_id = o.org_id
                   --
         left join td_sm_dict_item di
                   on o.org_level = di.item_id
where f.businessid = #businiessid
  

Комментарии:

1. спасибо за помощь. но мне нужно, если сначала выберите «найти строки», а затем не запускайте другую. если использовать объединение, то я добавлю несколько дополнительных строк, которые мне не нужны.

2. Разница между Select 1 и Select 2 заключается только в терминах, где STATE = ‘2’ и (LINK_ORG_ID = #link_org_id) и STATE = ‘2’ и (LINK_ORG_ID равен нулю или LINK_ORG_ID = «) запрос. Вы должны использовать условие or, т. е. если первое условие истинно, то система не будет искать второе условие.

3. Обновил мой ответ на основе вашего комментария, пожалуйста, проверьте

4. спасибо за вашу доброту. Я просто проверяю обновленную. но результаты возвращает extral linkman. мне нужно, чтобы если link_org_id = ‘xxxx’ у одного linkman и его org_id = td_archive_feedback’s recv_org_id, то не нужно было искать других linkman . но после обновления результаты показывают, что 2-е условие также выполняется. я получаю другого linkman, чей link_org_id равен null или link_org_id = ‘ ‘.

5. Лучше добавить некоторые примеры данных и ожидаемый результат к вашему вопросу.