"NOT EXISTS" 可以仅通过交换句子来替换 "NOT IN" 吗?

Can "NOT EXISTS" replace "NOT IN" by only swapping the sentences?

当 NOT EXISTS 与 NOT IN 一起正常工作时,我如何让 NOT EXISTS 在这里工作,我应该使用 NOT EXISTS 得到相同的结果,但我没有。

我使用 NOT EXISTS 语句的逻辑有什么问题

NOT EXISTS 应该与 A.C_SEQUENCE 比较,就像 NOT IN。与为我提供正确记录的 NOT IN 相同的逻辑。

Select A.C_SEQUENCE, A.STATUS 
FROM PROD.CONTROL A
where A.AID = 'BILLINGS'
and A.USER='GLOBAL_NETWORK'
--and A.STATUS = 'ON'
and NOT EXISTS
(
        select B.H_SEQUENCE
        from PROD.STATUS_R B, PROD.CONTROL A
        where A.USER='GLOBALNETWORK'
        and A.C_SEQUENCE = B.H_SEQUENCE 
        and B.H_STAT in('IGN','ACK')
)
order by C_date DESC limit 5000

Select A.C_SEQUENCE, A.STATUS 
FROM PROD.CONTROL A
where A.AID = 'BILLINGS'
and A.USER='GLOBAL_NETWORK'
--and A.STATUS = 'ON'
and A.C_SEQUENCE NOT IN 
(
        select B.H_SEQUENCE
        from PROD.STATUS_R B, PROD.CONTROL A
        where A.USER='GLOBALNETWORK'
        and A.C_SEQUENCE = B.H_SEQUENCE 
        and B.H_STAT in('IGN','ACK')
)
order by C_date DESC limit 5000 

没有样本数据,这只是瞎猜,但我会这样写 NOT EXISTS 版本:

Select A.C_SEQUENCE, A.STATUS 
FROM PROD.CONTROL A
where A.AID = 'BILLINGS'
and A.USER='GLOBAL_NETWORK'
--and A.STATUS = 'ON'
and NOT EXISTS
(
        select *
        from PROD.STATUS_R B
        and A.C_SEQUENCE = B.H_SEQUENCE 
        and B.H_STAT in('IGN','ACK')
)
order by C_date DESC limit 5000

NOT EXISTS 意味着您只需要外部 select 记录,而子 select 没有 return 记录。但实际上,由于子 select 不包含很多不在外部 select 中的东西,这样写可能会更好:

Select A.C_SEQUENCE, A.STATUS 
FROM PROD.CONTROL A
  left exception join prod.status_r_b b
    on b.h_sequence = a.c_sequence
      and b.h_stat in ('IGN', 'ACK')
where A.AID = 'BILLINGS'
  and A.USER='GLOBAL_NETWORK'
--and A.STATUS = 'ON'
order by C_date DESC limit 5000

您还应该能够像这样简化 NOT IN 版本:

Select A.C_SEQUENCE, A.STATUS 
FROM PROD.CONTROL A
where A.AID = 'BILLINGS'
and A.USER='GLOBAL_NETWORK'
--and A.STATUS = 'ON'
and A.C_SEQUENCE NOT IN 
(
        select B.H_SEQUENCE
        from PROD.STATUS_R B
        and B.H_STAT in('IGN','ACK')
)
order by C_date DESC limit 5000

在这种情况下,NOT IN 承认行可以被 returned,但您只能从 prod.control 中找到序列号不在的 select 行过滤后的 prod.status_r 结果集。