我想知道是否有人可以幫助我使用此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