Oracle: объединение всех запросов 1 и 2 хочет уменьшить количество строк, если в запросе 1 есть rowdata

#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 этого условия.