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