我想知道是否有人可以帮助我使用此SQL语句吗?t-SQL更新表以删除重叠的时间范围
说,我有一个SQL Server 2008中的表是这样的:
id -- INT PRIMARY KEY
dtIn -- DATETIME2
dtOut -- DATETIME2
type -- INT
id dtIn dtOut type
1 05:00 10:00 1
2 08:00 16:00 2
3 02:00 08:00 1
4 07:30 11:00 1
5 07:00 12:00 2
我需要删除的任何时间上表重叠。这可以用这个图来说明:
所以我想出了这个SQL:
UPDATE [table] AS t
SET dtOut = (SELECT MIN(dtIn) FROM [table] WHERE type = t.type AND t.dtIn >= dtIn AND t.dtIn < dtOut)
WHERE type = t.type AND t.dtIn >= dtIn AND t.dtIn < dtOut
但它不工作。任何想法我在这里做错了什么?
**** ****编辑
OK,我花了一段时间去这一点。似乎是什么,我需要它的工作SQL:
--BEGIN TRANSACTION;
--delete identical dtIn
DELETE dT1
FROM tbl dT1
WHERE EXISTS
(
SELECT *
FROM tbl dT2
WHERE dT1.Type = dT2.Type
AND dT1.dtIn = dT2.dtIn
AND (
dT1.dtOut < dT2.dtOut
OR (dT1.dtOut = dT2.dtOut AND dT1.id < dT2.id)
)
);
--adjust dtOuts to the max dates for overlapping section
UPDATE tbl
SET dtOut = COALESCE((
SELECT MAX(dtOut)
FROM tbl as t1
WHERE t1.type = tbl.type
AND t1.dtIn < tbl.dtOut
AND t1.dtOut > tbl.dtIn
), dtOut);
-- Do the actual updates of dtOut
UPDATE tbl
SET dtOut = COALESCE((
SELECT MIN(dtIn)
FROM tbl as t2
WHERE t2.type = tbl.type AND
t2.id <> tbl.id AND
t2.dtIn >= tbl.dtIn AND t2.dtIn < tbl.dtOut
), dtOut);
--COMMIT TRANSACTION;
感谢。我需要尝试一下。仅仅从好奇心,什么书和它在哪里是你提到的代码参考? – ahmd0 2012-07-19 22:55:26
我正在考虑Joe Celko的SQL for Smarties:Advanced SQL Programming的第29章。我可以看到目录而不是章节。 – shawnt00 2012-07-19 23:05:49
对于同一行检查,是否更容易检查id列? – ahmd0 2012-07-19 23:06:04