#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. Лучше добавить некоторые примеры данных и ожидаемый результат к вашему вопросу.