我想知道用于删除旧数据的sql语句以及与旧数据的关联,而不删除应该永远存在的更重要的父表。
我有以下表格:
Step
Id bigint
OccurredOn datetime
ScreenshotId bigint
Screenshot
Id bigint
Data varbinary(max)
我想删除与Screenshot
超过30天的Step
相关联的所有OccurredOn
条记录。 Step
仍然会保留为ScreenshotId
。
执行此操作的最佳SQL语句是什么?
答案 0 :(得分:3)
使用:
UPDATE STEP
SET screenshotid = NULL
WHERE occurredon < DATEADD(dd, -30, GETDATE())
DELETE FROM SCREENSHOT
WHERE NOT EXISTS(SELECT NULL
FROM STEP s
WHERE s.screenshotid = id)
答案 1 :(得分:1)
不幸的是,据我所知,你不能直接使用OUTPUT子句链接,但是this method (live runnable version)确保你只会删除你刚刚孤立的任何截图行(而不是任何现有的孤儿): / p>
-- SO3208939
CREATE TABLE #Screenshot (
Id bigint IDENTITY(100000, 10) NOT NULL
,Data varbinary(max) NULL
)
CREATE TABLE #Step (
Id bigint IDENTITY NOT NULL
,OccurredOn datetime NOT NULL
,ScreenshotId bigint NULL REFERENCES #Screenshot(Id)
)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('1/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('2/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('3/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('4/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('5/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('6/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('7/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('8/1/2010', @@IDENTITY)
-- SELECT * FROM #Screenshot
-- SELECT * FROM #Step
DECLARE @Deleted AS TABLE (Id bigint NOT NULL)
UPDATE #Step
SET ScreenshotId = NULL
OUTPUT DELETED.ScreenshotId
INTO @Deleted
WHERE OccurredOn < DATEADD(dd, -30, GETDATE())
DELETE FROM #Screenshot
WHERE Id IN (SELECT Id FROM @Deleted)
-- SELECT * FROM #Step
SELECT * FROM #Screenshot