sql - 获取所有早于 X 天的 SQL 服务器数据库记录

我正在处理从 websiteTestLocation table (其中 websiteSnapshotStartTime 早于 X 天)中删除记录的查询。

(截断的)table 结构如下所示:

Table name Column
websiteSnapshot websiteSnapshotRecordId
websiteSnapshot websiteSnapshotStartTime
website websiteSnapshotRecordId
website websiteRecordId
websiteTestLocation websiteRecordId

websiteTestLocation table 的“websiteRecordId”链接到网站 table 中的同一列,网站 table 的“websiteSnapshotRecordId”链接到 websiteSnapshot table 中的同一列。

我可以使用以下方法获取所有 websiteSnapshot 记录(超过 1 天):

SELECT (websiteSnapshotId)
    FROM [dbo].websiteSnapshot
    WHERE websiteSnapshotStartTime IN (
        SELECT
            (websiteSnapshotStartTime)
        FROM
            [dbo].websiteSnapshot
        WHERE
            websiteSnapshotStartTime < DATEADD(day, -1, GETDATE())
    )

但是当我将其包含在我的其余查询中时,我得到了错误:

子查询返回超过 1 个 value。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

整个查询如下所示:

--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 天的记录中获取数据。

回答1

一点一点地分解你的查询。

从表面上看,这一点看起来不错

select * FROM [dbo].websiteTestLocation wtl
LEFT JOIN [dbo].website w ON w.websiteRecordId = wtl.websiteRecordId

但是下一个 JOIN 无处不在。看起来您正试图将 LEFT OUTER JOIN 限制为 table website 中的记录

LEFT JOIN [dbo].websiteSnapshot snap ON snap.websiteSnapshotId IN (w.websiteSnapshotId)

改用 INNER JOIN 和这个 ON 子句

ON snap.websiteSnapshotId = w.websiteSnapshotId

接下来是您的 WHERE 子句-这是您报告的问题的来源。您正在尝试将单个 value 匹配到 values 列表,这将永远无法正常工作。所有这些

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())

相似文章

go - golang 如何从字符串中查找表情符号?

我想查找表情符号是否存在并替换为字符串(HTMLunicode)。(符文到字符串)例如,这是句子“我喜欢你哈哈哈😀你好。”这就是结果。“我喜欢你哈哈哈😀你好。”表情符号和表情符号位置是随机的。我将...

javascript - Sorting 在另一个排序中

我有一组具有多个属性的数据,我希望它们排序的主要方式是在项目A之后放置项目B,但我不想影响这些项目之外的顺序。数据集(不分先后):记录1记录2记录3(具有项目A属性)记录4记录5(项目A)数据集(按A...

最新文章