[英]Getting all SQL Server database records older than X days
我正在处理从 websiteTestLocation 表中删除记录的查询(其中 websiteSnapshotStartTime 早于 X 天)。
(截断的)表结构如下所示:
表名 | 柱子 |
---|---|
网站快照 | 网站快照记录 ID |
网站快照 | 网站快照开始时间 |
网站 | 网站快照记录 ID |
网站 | 网站记录 ID |
网站测试位置 | 网站记录 ID |
websiteTestLocation 表的“websiteRecordId”链接到网站表中的同一列,网站表的“websiteSnapshotRecordId”链接到 websiteSnapshot 表中的同一列。
我可以使用以下方法获取所有 websiteSnapshot 记录(超过 1 天):
SELECT (websiteSnapshotId)
FROM [dbo].websiteSnapshot
WHERE websiteSnapshotStartTime IN (
SELECT
(websiteSnapshotStartTime)
FROM
[dbo].websiteSnapshot
WHERE
websiteSnapshotStartTime < DATEADD(day, -1, GETDATE())
)
但是当我将其包含在我的其余查询中时,我得到了错误:
子查询返回超过 1 个值。 当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。
整个查询如下所示:
--DELETE FROM [dbo].websiteTestLocation wtl
select * FROM [dbo].websiteTestLocation wtl
LEFT JOIN [dbo].website w ON w.websiteRecordId = wtl.websiteRecordId
LEFT JOIN [dbo].websiteSnapshot snap ON snap.websiteSnapshotId IN (w.websiteSnapshotId)
WHERE (SELECT (websiteSnapshotId)
FROM [dbo].websiteSnapshot
WHERE websiteSnapshotStartTime IN (
SELECT
(websiteSnapshotStartTime)
FROM
[dbo].websiteSnapshot
WHERE
websiteSnapshotStartTime < DATEADD(day, -1, GETDATE())
)) = snap.websiteSnapshotId
GO
我明白,因为“foreach”循环会有所帮助,所以我一定做错了什么。 如果我将“MAX”放在第 5 行的“websiteSnapshotId”前面和第 9 行的 websiteSnapshotStartTime 前面,那么我会得到数据,但不是所有预期的行。 我只从“最新”网站SnapshotStartTime 早于 1 天的记录中获取数据。
一点一点地分解你的查询。
从表面上看,这一点看起来不错
select * FROM [dbo].websiteTestLocation wtl
LEFT JOIN [dbo].website w ON w.websiteRecordId = wtl.websiteRecordId
但是下一个 JOIN 无处不在。 看起来您正试图将 LEFT OUTER JOIN 限制为仅表website
中的记录
LEFT JOIN [dbo].websiteSnapshot snap ON snap.websiteSnapshotId IN (w.websiteSnapshotId)
改用INNER JOIN
和这个ON
子句
ON snap.websiteSnapshotId = w.websiteSnapshotId
接下来是您的WHERE
子句 - 这是您报告的问题的来源。 您正在尝试将单个值与值列表匹配,这将永远无法正常工作。 所有这些
WHERE (SELECT (websiteSnapshotId)
FROM [dbo].websiteSnapshot
WHERE websiteSnapshotStartTime IN (
SELECT
(websiteSnapshotStartTime)
FROM
[dbo].websiteSnapshot
WHERE
websiteSnapshotStartTime < DATEADD(day, -1, GETDATE())
)) = snap.websiteSnapshotId
可以替换为
WHERE websiteSnapshotStartTime < DATEADD(day, -1, GETDATE())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.