在一个 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
我有 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