簡體   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