我必须创建一个基本上查询表 A 的视图,并确保相同的项目存在于表 B 中,因此如果表 A 中的项目不存在于表 B 中,则在我的视图中创建一条记录,以及一个外部过程触发警报。我遇到的问题是,有时会在表 A 中的记录创建几秒钟后创建表 B 中的记录,有时会触发误报。所以我需要在视图创建中添加某种延迟,如果在触发警报之前表 A 中的项目在表 B 中不存在,则等待至少 5 秒来创建记录。
所以如果我有:
表_A
物品 | 创作日期 |
---|---|
XY | 00:00:01 |
表_B
物品 | 创作日期 |
---|---|
XY | 00:00:03 |
我使用这个查询在 sql server 中创建一个视图:
select * from Table_A A
where A.Item not in (
select B.Item
from Table_B B)
where A.Creation_Date >= DATEADD(minute, -10, GETDATE())
and A.Creation_Date >= DATEADD(minute, -10, GETDATE())
如果警报过程在 00:00:02 运行,它将在视图中创建记录,并触发警报。
我怎样才能避免这种情况并等待几秒钟以确保绝对不会创建 Table_B 中的记录?
谢谢
您可以在
where
子句中添加另一个不等式条件,以排除最近的记录:
select *
from Table_A A
where
A.Item not in (select B.Item from Table_B B)
and A.Creation_Date >= DATEADD(minute, -10, GETDATE())
and A.Creation_Date < DATEADD(second, -10, GETDATE())
根据程序运行的频率,您可能还需要调整其他界限:
. . .
and A.Creation_Date >= DATEADD(second, -10, DATEADD(minute, -10, GETDATE()))
and A.Creation_Date < DATEADD(second, -10, GETDATE())
您也许可以尝试使用 not exists 并将所需的时间延迟作为相关标准的一部分包括在内:
select *
from Table_A a
where not exists (
select * from Table_B b
where a.Item = b.Item
and a.Creation_Date < DateAdd(second, -5, GetDate())
);