包含From Date和To Date的表格。查询应删除那些FromDate和ToDate位于已存在行的区间中的行。
表
bookingID FromDate ToDate
15 2015-04-29 17:00:00.000 2015-04-29 18:00:00.000
13 2015-05-01 10:00:00.000 2015-05-01 14:00:00.000
14 2015-05-01 13:00:00.000 2015-05-01 14:00:00.000
结果
bookingID FromDate ToDate
13 2015-05-01 10:00:00.000 2015-05-01 14:00:00.000
15 2015-04-29 17:00:00.000 2015-04-29 18:00:00.000
截至2015-05-01日期,第1行的时间为上午10点至下午2点。第1行已经涵盖第2行,时间是下午1点到下午2点。
修改
为了更清楚这种情况,表中的两个区间不能多,即在int中的A是唯一的复杂程度。 如果在B中应该删除B,那么如果A中的A
答案 0 :(得分:5)
我认为您可以使用EXISTS
子查询完成此操作...
SELECT * FROM table a
WHERE NOT EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID )
我不确定你是如何定义&#34;在区间&#34;但这应该给你正确的想法。
由于我现在明白你正试图从表中实际删除记录,你必须反转逻辑并使其成为DELETE查询而不是SELECT查询:
DELETE FROM table a
WHERE EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID )
为了允许可能有2条记录具有相同FromDate
且相同ToDate
的情况,我们可以保留两条记录:
SELECT * FROM table a
WHERE NOT EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID
AND (b.FromDate != a.FromDate OR b.ToDate != a.ToDate) )
或只包含以下其中一条记录:
SELECT * FROM table a
WHERE NOT EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID
AND (b.FromDate != a.FromDate
OR b.ToDate != a.ToDate
OR a.bookingID < b.bookingID) )
(我已将其移回SELECT,因为您可以以非破坏性的方式对其进行测试。通过将前两个单词更改为DELETE并删除它,可以轻松切换回DELETE查询NOT。)
答案 1 :(得分:1)
这将返回另一个记录中包含的所有记录。
SELECT B.*
FROM tableName A
LEFT JOIN tableName B
on A.FromDate<= B.FromDate
and A.ToDate>= B.FromDate
and A.bookingID < B.BookingID
删除..
Delete from TableName where ID not in
(Select b.ID
FROM tableName A
LEFT JOIN tableName B
on A.FromDate<= B.FromDate
and A.ToDate>= B.FromDate)
and A.bookingID < B.BookingID
但是,如果您还需要以某种方式指示和处理OVERLAP而不仅仅是完全包含,那就不同了。因此,清楚地了解你想要完成的事情会有所帮助。
你是
吗?您给我们的是您尝试解决的技术问题,但如果没有上下文和用例,您将得到您所要求的内容,这可能不是您的问题#39;重新尝试解决的问题是XY problem?