#sql #oracle #union-all
#sql #Oracle #объединение-все
Вопрос:
мой запрос, как показано ниже, я хочу исключить некоторые строки из query1, когда в query2 есть rowdata, но я не знаю, как это сделать:
мой запрос:
with query1 as(
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) ,
query2 as(
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 = '55')) t
group by org_id)
select *
from query1
union all
select *
from query2 minus
-- this doesn't work ,i want to minus the rowdata from query 1 when query1.org_id = query2.org_id. the query2 is marked as outer query column.
(select * from query1 where query1.ORG_ID = query2.ORG_ID)
;
пример таблицы
name phone link_org_id org_id
lily 133 1
ming 144 1
hao 333 2
jane 1234 55 2
bob 666 3
herry 555 3
результат запроса 1:
name phone org_id
lily,ming 133,144 1
hao 333 2
bob,herry 666,555 3
результат запроса 2:
name phone org_id
jane 1234 2
например, Джейн выбирается запросом 2, а хао выбирается запросом 1. Все они из одной организации, org_id которой = 2 . но мне не нужен Хао, мне просто нужна Джейн. как сделать?
я имею в виду, что если query2 может найти результат, то результат query1 не нужен. но если query2 не может найти никаких данных, тогда мне нужны данные query1.
Комментарии:
1. Объединение или объединение всех не смогут достичь того же, либо вы фильтруете данные с помощью одного запроса, либо фильтруете данные после инструкции union.
2. Похоже, вам нужен антисоединитель, а не минус
Ответ №1:
Как сейчас, вам сначала придется разбить имена (и телефоны) на строки, а затем применить операторы set ( UNION
, MINUS
) к таким данным.
Это означает, что вы вообще не должны использовать WM_CONCAT
; по крайней мере, не в начале, потому что
- сначала вы объединяете данные
- тогда вам придется разделить его обратно на строки
UNION
/MINUS
устанавливает
Выполнение бесполезной работы на первых 2 шагах.
Я бы посоветовал вам сначала UNION
/ MINUS
данные, затем объединить их с помощью WM_CONCAT
. Кстати, какую версию базы данных вы используете? WM_CONCAT
является а) недокументированным, б) даже не существует в последних версиях базы данных Oracle, поэтому вы предпочли бы переключиться на LISTAGG
, если это возможно.
Комментарии:
1. Спасибо. также не работает, когда я использую минус. я не знаю, как минус строка, когда я объединяю эти запросы tow, и минус строка query1 с помощью query1.orgid = query2.orgid этого условия.