Oracle:如果查询 1 有行数据,则联合所有查询 1 和查询 2 想要减去一些行
Posted
技术标签:
【中文标题】Oracle:如果查询 1 有行数据,则联合所有查询 1 和查询 2 想要减去一些行【英文标题】:Oracle: union all query 1 and query 2 want to minus some rows if query 1 have rowdata 【发布时间】:2020-08-20 06:40:40 【问题描述】:我的查询如下,当 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,
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的数据。
【问题讨论】:
联合或联合都无法达到相同的效果,要么使用单个查询过滤数据,要么在联合语句后过滤数据。 看起来你需要antijoin,而不是减号 【参考方案1】:现在的情况是,您首先必须将姓名(和电话)拆分成行,然后将集合运算符(UNION
、MINUS
)应用于此类数据。
这意味着你根本不应该使用WM_CONCAT
;至少,不是一开始,因为
UNION
/ MINUS
套
在前两个步骤中做无用的工作。
我建议您先使用UNION
/ MINUS
数据,然后 使用WM_CONCAT
聚合它们。顺便问一下,您使用哪个数据库版本? WM_CONCAT
是 a) 未记录的,b) 甚至在最新的 Oracle 数据库版本中都不存在,因此如果可能,您宁愿切换到 LISTAGG
。
【讨论】:
谢谢。当我使用减号时也不起作用。我不知道当我合并这些两个查询时如何减去该行并通过 query1.orgid = query2.orgid 这个条件减去 query1 的行。以上是关于Oracle:如果查询 1 有行数据,则联合所有查询 1 和查询 2 想要减去一些行的主要内容,如果未能解决你的问题,请参考以下文章
oracle 表一的A、B两个字段是联合主键,表二使用表一的A字段作为外键,这样可以吗?