【问题标题】:Can "NOT EXISTS" replace "NOT IN" by only swapping the sentences?“NOT EXISTS”可以通过只交换句子来代替“NOT IN”吗?
【发布时间】:2018-02-01 13:34:51
【问题描述】:

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

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

NOT EXISTS 应该像 NOT IN 一样与 A.C_SEQUENCE 进行比较。与给我正确记录的 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 

【问题讨论】:

  • 我怀疑你在任何一种情况下都不希望在相关子查询中出现, PROD.CONTROL A
  • 请提供带有预期和实际结果的样本数据。
  • @mustaccio 谢谢,您的评论通过删除查询运行完美的 PROD.CONTROL A 解决了这个问题。现在我不明白为什么?
  • 您需要将您从 PROD.STATUS_R 中选择的内容与来自 PROD.CONTROL 的外部查询中的特定记录相关联。相反,您在子选择中提供了一个单独的 PROD.CONTROL 实例,具有相同的相关名称 A 以使事情更加混乱。因此,子选择与外部选择不相关。

标签: db2 db2-400


【解决方案1】:

如果没有样本数据,这只是在黑暗中拍摄,但我会这样写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 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 承认可以返回行,但您只会从prod.control 中选择序列号不在过滤后的prod.status_r 结果集中的行。

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 2021-10-02
    • 2015-02-20
    • 2014-12-29
    • 2013-11-18
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2013-04-17
    相关资源
    最近更新 更多