SQL Server关联表早于X天记录的查询删除及子查询多值错误处理
解决删除关联早于X天记录的SQL查询问题
首先,咱们先理清问题的核心:你之前的查询报错是因为用了=去匹配一个返回多行结果的子查询,这就像你要找一群人,但只给了一个座位号,肯定行不通。而且你用MAX只能拿到最新的那条记录,没法覆盖所有符合条件的数据,这显然不是你想要的。
问题根源梳理
你的表关联关系是:
websiteTestLocation←website(通过websiteRecordId)website←websiteSnapshot(通过websiteSnapshotRecordId)
你需要筛选的是websiteSnapshot中websiteSnapshotStartTime早于X天的记录,再关联到websiteTestLocation进行删除。
正确的查询写法(先验证再删除)
首先推荐用JOIN关联的方式,这种写法逻辑清晰,性能也更优:
第一步:验证要删除的记录(先跑SELECT确认数据)
SELECT wtl.* FROM [dbo].websiteTestLocation wtl INNER JOIN [dbo].website w ON w.websiteRecordId = wtl.websiteRecordId INNER JOIN [dbo].websiteSnapshot snap ON snap.websiteSnapshotRecordId = w.websiteSnapshotRecordId WHERE snap.websiteSnapshotStartTime < DATEADD(day, -1, GETDATE()) -- 这里的-1可以换成你需要的X天
第二步:执行删除操作
确认SELECT的结果是你要删除的记录后,把SELECT wtl.*改成DELETE wtl即可:
DELETE wtl FROM [dbo].websiteTestLocation wtl INNER JOIN [dbo].website w ON w.websiteRecordId = wtl.websiteRecordId INNER JOIN [dbo].websiteSnapshot snap ON snap.websiteSnapshotRecordId = w.websiteSnapshotRecordId WHERE snap.websiteSnapshotStartTime < DATEADD(day, -1, GETDATE()) GO
如果你非要用子查询的方式
如果习惯用子查询,把之前的=改成IN就行,同时简化冗余的子查询(你之前的子查询嵌套完全没必要):
-- 验证语句 SELECT * FROM [dbo].websiteTestLocation wtl INNER JOIN [dbo].website w ON w.websiteRecordId = wtl.websiteRecordId WHERE w.websiteSnapshotRecordId IN ( SELECT websiteSnapshotRecordId FROM [dbo].websiteSnapshot WHERE websiteSnapshotStartTime < DATEADD(day, -1, GETDATE()) ) -- 删除语句 DELETE wtl FROM [dbo].websiteTestLocation wtl INNER JOIN [dbo].website w ON w.websiteRecordId = wtl.websiteRecordId WHERE w.websiteSnapshotRecordId IN ( SELECT websiteSnapshotRecordId FROM [dbo].websiteSnapshot WHERE websiteSnapshotStartTime < DATEADD(day, -1, GETDATE()) ) GO
额外说明
- 为什么用
INNER JOIN而不是LEFT JOIN?因为我们只需要那些确实关联到符合条件的websiteSnapshot的websiteTestLocation记录,LEFT JOIN会包含没有关联的NULL记录,这不是我们要删除的目标。 - 你之前的子查询里有冗余的嵌套:
SELECT ... WHERE websiteSnapshotStartTime IN (SELECT websiteSnapshotStartTime FROM ...),直接写成SELECT websiteSnapshotRecordId FROM websiteSnapshot WHERE websiteSnapshotStartTime < ...就够了,没必要绕一圈。
内容的提问来源于stack exchange,提问作者StackExchangeGuy
相关产品推荐
相关产品推荐

