如果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
答案 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>