繁体   English   中英

获取所有早于 X 天的 SQL Server 数据库记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM