删除其他日期中包含的日期?

Leg*_*end 5 sql t-sql sql-server sql-server-2008

我有以下几行:

CREATE TABLE #TEMP (id int, name varchar(255), startdate datetime, enddate datetime)
INSERT INTO #TEMP VALUES(1, 'John', '2011-01-11 00:00:00.000','2011-01-11 00:01:10.000')
INSERT INTO #TEMP VALUES(2, 'John', '2011-01-11 00:00:20.000','2011-01-11 00:01:05.000')
INSERT INTO #TEMP VALUES(3, 'John', '2011-01-11 00:01:40.000','2011-01-11 00:01:50.000')
INSERT INTO #TEMP VALUES(4, 'Adam', '2011-01-11 00:00:40.000','2011-01-11 00:01:20.000')
INSERT INTO #TEMP VALUES(5, 'Adam', '2011-01-11 00:00:45.000','2011-01-11 00:01:15.000')

SELECT * FROM #TEMP

DROP TABLE #TEMP
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除其他日期中包含日期的记录,以获取以下内容:

John 2011-01-11 00:00:00.000 2011-01-11 00:01:10.000
John 2011-01-11 00:01:40.000 2011-01-11 00:01:50.000
Adam 2011-01-11 00:00:40.000 2011-01-11 00:01:20.000
Run Code Online (Sandbox Code Playgroud)

有关如何为大约100K行的表实现此目的的任何建议?

Tim*_*ter 2

这给出了期望的结果:

DELETE T1 FROM #TEMP T1
WHERE EXISTS(
    SELECT NULL FROM #TEMP T2
    WHERE   t1.id <> t2.id
    AND     t1.name = t2.name
    AND     t1.startdate >= t1.startdate
    AND     t1.enddate   <= t1.enddate
)
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/ms188336.aspx

编辑:我刚刚注意到有一个问题。如果存在重复项(相同的开始日期和结束日期),则两者都将被删除(约翰的方法不会删除任何重复项,即使只有一个相同的日期)。所以你需要考虑到这一点:

DELETE T1 FROM #TEMP T1
WHERE EXISTS(
    SELECT NULL FROM #TEMP T2
    WHERE   t1.id <> t2.id
    AND     t1.name = t2.name
    AND     t1.startdate > t2.startdate
    AND     t1.enddate   < t2.enddate
    OR      t1.id <> t2.id
    AND     t1.name = t2.name
    AND     t1.startdate = t2.startdate
    AND     t1.enddate   < t2.enddate
    OR      t1.id <> t2.id
    AND     t1.name = t2.name
    AND     t1.startdate > t2.startdate
    AND     t1.enddate   = t2.enddate
    OR      t1.id > t2.id
    AND     t1.name = t2.name
    AND     t1.startdate = t2.startdate
    AND     t1.enddate   = t2.enddate
)
Run Code Online (Sandbox Code Playgroud)

  • 约翰和蒂姆都有很好的疑问。我实际上认为连接会更快,但它肯定不是(我不考虑索引)。我加载了一个包含 2.384.001 个随机数据的测试表,EXIST 版本在 1:43 内完成,而我在 10 分钟后停止了 JOIN 版本。估计执行计划不同,并且为 EXIST 退出提供较少的逻辑读取,而如果仅考虑运算符,则 2.384.001 记录的实际计划会生成相同的计划。EXISTS 可以在找到匹配项后停止扫描,这是一个很大的优势。 (2认同)