"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
结果集。
当 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
结果集。