问题描述
我的查询如下,当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的数据。
解决方法
现在,您首先必须将名称(和电话)拆分为行,然后将集合运算符(UNION
,MINUS
)应用于此类数据。
这意味着您根本不应该使用WM_CONCAT
;至少不是在一开始,因为
- 首先连接数据
- 然后您必须将其拆分成几行
-
UNION
/MINUS
设置
在前两个步骤中做无用的工作。
我建议您先UNION
/ MINUS
数据,然后然后使用WM_CONCAT
对其进行汇总。顺便问一下,您使用哪个数据库版本? WM_CONCAT
是a)未记录,b)在最新的Oracle数据库版本中甚至都不存在,因此,如果可能,您宁愿切换到LISTAGG
。