Sql-Server

根據一張表中的日期刪除兩張表中的數據

  • November 2, 2021

我正在嘗試刪除日期欄位值早於 30 天的表中的數據,並根據兩個表中的匹配鍵列刪除沒有日期欄位的第二個表中的相關記錄。

表格1:

|---------------------|------------------|--------------|
|        Name         |     age          | ExecutionDate|
|---------------------|------------------|--------------|
|          jack       |     34           | 12/12/2019   |
|---------------------|------------------|--------------|
|          Ryan       |     24           | 10/12/2019   |
|---------------------|------------------|--------------|

表 2:

|---------------------|------------------|--------------|
|         city        |     county       | Name         |
|---------------------|------------------|--------------|
|          jersey     |     orange       | jack         |
|---------------------|----------------- |--------------|
|          LA         |     wayne        | Ryan         |
|---------------------|------------------|--------------|

刪除語句:

delete from table2 where Name IN (select Name from table1 where date < ExecutionDate(day, -30, GETDATE()))

這是一個簡單的查詢,但是它需要兩個單獨的語句,首先是 Table2 上的 DELETE,然後是 Table1 上的 DELETE:

DELETE 
FROM [Table2] t2
INNER JOIN [Table1] t1 ON t1.[Name] = t2.[Name]
WHERE t1.[ExecutionDate] < DATEADD(DAY, -30, GETDATE());

DELETE 
FROM [Table1] t1
WHERE t1.[ExecutionDate] < DATEADD(DAY, -30, GETDATE());

我還想指出,在不了解完整數據模型或要求的情況下,這樣做可能會引入數據一致性問題。如果您在 Table2 中有一條“John”的記錄,該記錄在 Table1 中有兩條記錄 - 一條是 45 天,另一條是 10 天 - Table2 中的“John”記錄將被刪除,並且 Table1 的 10 天之間的連結舊記錄和 Table2 將被破壞,因為“約翰”記錄不再存在。

如果您想保留 Table2 記錄(如果仍然存在任何少於 30 天的 Table1 記錄,請使用以下內容:

DELETE 
FROM [Table2] t2
INNER JOIN [Table1] t1 ON t1.[Name] = t2.[Name]
WHERE t1.[ExecutionDate] < DATEADD(DAY, -30, GETDATE());
  AND t2.[Name] NOT IN (SELECT [Name] FROM [Table1] WHERE [ExecutionDate] >= DATEADD(DAY, -30, GETDATE()) AND [Name] = t2.[Name])

DELETE 
FROM [Table1] t1
WHERE t1.[ExecutionDate] < DATEADD(DAY, -30, GETDATE());

WHERE 子句中的附加內部 SELECT 檢查小於或等於 30 天且名稱與 30 天以上的記錄匹配的 Table1 記錄,並僅刪除 Table2 中沒有小於 30 天的 Table1 記錄的那些行老的。

引用自:https://dba.stackexchange.com/questions/257416