“NOT EXISTS”只能通过交换句子来代替“NOT IN”吗?

时间:2018-02-01 13:34:52

标签: db2 db2-400

如果NOT IN EXISTS与NOT IN正常工作,我怎么能在这里工作?我应该使用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 

1 个答案:

答案 0 :(得分:3)

如果没有样本数据,这只是一个黑暗的镜头,但我会用这样的方式编写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结果集中的行。< / p>