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】:

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

这意味着你根本不应该使用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字段作为外键,这样可以吗?

oracle查询重复数据方法

oracle中的联合查询[关闭]

oracle查看是主库还是从库

如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?

Eloquent - 如果外键有行,则防止删除数据 - Laravel