在一个 table 中查找其他 table 中不存在的行的最快方法

Most fastest way to find rows in one table which are not present in other table

我有 2 个 tables,一个叫“预订”,另一个叫“作业”,这两个 tables

之间没有关系

“预订”tables 包含列“资源”、“开始日期”、“结束日期”、“小时”

“作业”table 包含列“资源”、“开始日期”、“结束日期”、“小时”

“预订”table 行是每日记录,意味着开始和结束日期将始终相同,并且小时数将小于 8(一天中的工作时间)

“分配”table 行可以是多天记录,表示开始和结束日期可以相同或不同,例如开始日期 01-02-2022 和结束日期 03-02-2022 和小时可以是 24 小时(每天最多 8 小时)

现在我必须找到“资源”的所有预订行,这些行在特定日期和时间没有等效的分配行

可能会有复杂的情况,其中“1-2-2022”的“资源 a”预订时间为“8 小时”,但同一日期和资源的分配行只有 6 小时,所以我需要也找到那些缺失的时间。

最快最有效的方法是什么?记录数以百万计,首选编程语言是 C#,如果 C# 不能给我一种在最多 30 分钟内处理所有这些的方法,也欢迎使用其他方法,比如将这 2 table 存储在 SQL 数据库和 运行 对其进行查询,以在第 3 个 table

中获得结果

感谢您的帮助

我会使用后端来做这样的过程。 每个 table 上校验和的索引将是有效的。 首先创建预订和分配 tables.

添加校验和:

ALTER TABLE Booking
ADD Booking_Checksum AS CHECKSUM( [Resource] ,[start date], [end date], [hours]) PERSISTED;

ALTER TABLE Assignment
ADD Assignment_Checksum AS CHECKSUM( [Resource] ,[start date], [end date], [hours]) PERSISTED;

添加索引:

CREATE NONCLUSTERED INDEX [IX_Booking_Checksum] ON [dbo].[Booking]
(   Booking_Checksum ASC )

CREATE NONCLUSTERED INDEX [IX_Assignment_Checksum] ON [dbo].[Assignment]
(   Assignment_Checksum ASC )

所有人都在预订但没有分配:

Select b.*
From Booking b
left join Assignment a on b.Booking_Checksum = a.Assignment_Checksum 
where a.Assignment_Checksum is null

所有在分配中但不在预订中:

Select a.*
From Assignment a
left join Booking b on b.Booking_Checksum = a.Assignment_Checksum 
where b.Booking_Checksum is null