Oracle:如果查询1具有rowdata,则将所有查询1和查询2合并以减去某些行

问题描述

我的查询如下,当query2具有rowdata时,我想从query1中减去一些行,但我不知道该怎么做:

我的查询

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,org_id
         from (select linkman_name,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由query2选择,而hao由查询1选择。它们全部来自同一个org_id = 2的组织。但是我不需要郝,我只需要简。怎么做? 我的意思是,如果query2可以找到result,那么就不需要query1的结果。但是,如果query2找不到任何数据,那么我需要query1的数据。

解决方法

现在,您首先必须将名称(和电话)拆分为行,然后将集合运算符(UNIONMINUS)应用于此类数据。

这意味着您根本不应该使用WM_CONCAT;至少不是在一开始,因为

  • 首先连接数据
  • 然后您必须将其拆分成几行
  • UNION / MINUS设置

在前两个步骤中做无用的工作。

我建议您先UNION / MINUS数据,然后然后使用WM_CONCAT对其进行汇总。顺便问一下,您使用哪个数据库版本? WM_CONCAT是a)未记录,b)在最新的Oracle数据库版本中甚至都不存在,因此,如果可能,您宁愿切换到LISTAGG