首页 > 解决方案 > 如果列的所有值都不同于某个字符串,则选择具有相同 id 的行

问题描述

我正在尝试编写一个 sql 查询,但我是这个领域的新手,我需要帮助。我有三个表,并且使用以下查询完成了 2 个内部联接:

select a1.SYS_ID, a1.U_JOURNEY_STATUS, b1.SYS_ID
     , b1.U_TICKET_JOURNEY_SYSID
     , b1.U_STATUS, c1.SYS_ID, c1.U_TICKET_JOURNEY_SYSID, c1.U_STATUS
  from NOCCIA_TICKET_JOURNEY_CONTROL a1 INNER JOIN NOCCIA_AUTOMATION_CONTROL b1
    on a1.SYS_ID=b1.U_TICKET_JOURNEY_SYSID 
 INNER JOIN NOCCIA_MANUAL_EX_CONTROL c1
    on b1.U_TICKET_JOURNEY_SYSID=c1.U_TICKET_JOURNEY_SYSID
 where ( ( a1.U_JOURNEY_STATUS='In Automation'
        OR a1.U_JOURNEY_STATUS='Alarms Cleared' ) ) 

结果如下:

在此处输入图像描述

SYS_ID 是第一张表的主键,而 U_TICKET_JOURNEY_SYS_ID 和 U_TICKET_JOURNEY_SYS_ID1 是第二张和第三张表的外键。但是,我真正想要的是仅选择所有行 U_STATUS 和 U_STATUS_1 与该 SYS_ID 的字符串不同的 SYS_ID。

标签: sqloracle

解决方案


使用count(). 表data是您的查询。对于每个条目,由于使用情况而count()扫描具有相同的行。 子句检查状态是否相同。这样我们扫描整个组的每一行。外部查询删除至少一个条目包含相同状态的组。sys_idpartitionCase when

这里我模拟了样本数据,其中只有 sys_id 115 符合条件:

with data(a_sys_id, a_status, b_sys_id, b_status, c_sys_id, c_status) as (
    select 110, 'Auto',   4, 'Closed',  4, 'Closed' from dual union all
    select 110, 'Auto', 101, 'Auto',    4, 'Closed' from dual union all
    select 115, 'Auto',  17, 'Closed', 21, 'Open'   from dual union all
    select 115, 'Auto',  21, 'Open',   21, 'Open'   from dual union all
    select 169, 'Auto',  32, 'Closed', 33, 'Closed' from dual union all
    select 169, 'Auto',  33, 'Open',   33, 'Open'   from dual union all
    select 169, 'Auto',  44, 'Open',   33, 'Auto'   from dual union all
    select 169, 'Auto',  47, 'Open',   33, 'Closed' from dual)
select a_sys_id, a_status, b_sys_id, b_status, c_sys_id, c_status
  from (
    select a_sys_id, a_status, b_sys_id, b_status, c_sys_id, c_status, 
           count(case when a_status = b_status or a_status = c_status then 1 end) 
               over (partition by a_sys_id) as cnt
      from data)
  where cnt = 0

Count()文档(查看分析示例)、演示和结果:

  A_SYS_ID A_STATUS   B_SYS_ID B_STATUS   C_SYS_ID C_STATUS
---------- -------- ---------- -------- ---------- --------
       115 Auto             17 Closed           21 Open
       115 Auto             21 Open             21 Open

推荐阅读