SQL 服务器只保留一个
SQL Server keep only one
我正在使用 SQL Server 2008R2 并且有一个 table (TableA) 可以在特定日期、时间段和房间保持酒店功能之间的冲突。
问题是它显示了两次,意思是发现 FunctionA 在某些方面与 FunctionB 冲突,然后显示 FunctionB 与 FunctionA
的冲突方式相同
orig_id conflicting_id event_name conflict_name on_date room_id time_from time_to conflict_from conflict_to
22108 22255 FunctionA FunctionB 15/06/2022 9 07:00 09:30 07:00 09:30
22108 22255 FunctionA FunctionB 15/06/2022 9 12:30 13:30 12:30 13:30
22108 22255 FunctionA FunctionB 15/06/2022 30 09:00 17:30 09:00 17:30
22108 22255 FunctionA FunctionB 15/06/2022 31 09:00 17:30 09:00 17:30
22108 22255 FunctionA FunctionB 15/06/2022 32 09:00 17:30 09:00 17:30
22255 22108 FunctionB FunctionA 15/06/2022 9 07:00 09:30 07:00 09:30
22255 22108 FunctionB FunctionA 15/06/2022 9 12:30 13:30 12:30 13:30
22255 22108 FunctionB FunctionA 15/06/2022 30 09:00 17:30 09:00 17:30
22255 22108 FunctionB FunctionA 15/06/2022 31 09:00 17:30 09:00 17:30
22255 22108 FunctionB FunctionA 15/06/2022 32 09:00 17:30 09:00 17:30
在上述情况下 FunctionA 与 FunctionB 在 on_date,room_id 上冲突,conflict_from,conflict_to
并且 FunctionB 在 same 标准上与 FunctionA 冲突。
如何只保留其中一个冲突集?
谢谢
您想删除存在重复的行。因此,使用 EXISTS
查找具有相同条件但切换了事件 ID 或名称的行。最后,为了不删除两行,决定一个,例如orig_id 大于 conflicting_id 的那一列(因此保留该行,反之亦然)。
delete from conflicts
where exists
(
select null
from conflicts same
where -- same criteria
same.on_date = conflicts.on_date
and same.room_id = conflicts.room_id
and same.time_from = conflicts.time_from
and same.time_to = conflicts.time_to
-- but switched IDs
and same.orig_id = conflicts.conflicting_id
and same.conflicting_id = conflicts.orig_id
)
and orig_id > conflicting_id;
我正在使用 SQL Server 2008R2 并且有一个 table (TableA) 可以在特定日期、时间段和房间保持酒店功能之间的冲突。
问题是它显示了两次,意思是发现 FunctionA 在某些方面与 FunctionB 冲突,然后显示 FunctionB 与 FunctionA
的冲突方式相同orig_id conflicting_id event_name conflict_name on_date room_id time_from time_to conflict_from conflict_to
22108 22255 FunctionA FunctionB 15/06/2022 9 07:00 09:30 07:00 09:30
22108 22255 FunctionA FunctionB 15/06/2022 9 12:30 13:30 12:30 13:30
22108 22255 FunctionA FunctionB 15/06/2022 30 09:00 17:30 09:00 17:30
22108 22255 FunctionA FunctionB 15/06/2022 31 09:00 17:30 09:00 17:30
22108 22255 FunctionA FunctionB 15/06/2022 32 09:00 17:30 09:00 17:30
22255 22108 FunctionB FunctionA 15/06/2022 9 07:00 09:30 07:00 09:30
22255 22108 FunctionB FunctionA 15/06/2022 9 12:30 13:30 12:30 13:30
22255 22108 FunctionB FunctionA 15/06/2022 30 09:00 17:30 09:00 17:30
22255 22108 FunctionB FunctionA 15/06/2022 31 09:00 17:30 09:00 17:30
22255 22108 FunctionB FunctionA 15/06/2022 32 09:00 17:30 09:00 17:30
在上述情况下 FunctionA 与 FunctionB 在 on_date,room_id 上冲突,conflict_from,conflict_to 并且 FunctionB 在 same 标准上与 FunctionA 冲突。
如何只保留其中一个冲突集?
谢谢
您想删除存在重复的行。因此,使用 EXISTS
查找具有相同条件但切换了事件 ID 或名称的行。最后,为了不删除两行,决定一个,例如orig_id 大于 conflicting_id 的那一列(因此保留该行,反之亦然)。
delete from conflicts
where exists
(
select null
from conflicts same
where -- same criteria
same.on_date = conflicts.on_date
and same.room_id = conflicts.room_id
and same.time_from = conflicts.time_from
and same.time_to = conflicts.time_to
-- but switched IDs
and same.orig_id = conflicts.conflicting_id
and same.conflicting_id = conflicts.orig_id
)
and orig_id > conflicting_id;