我有一個表(下面的結構),我需要通過洗掉每個行來清理它Object_ID:
WHERE Current_Step is NULL and Change = 'change'
and Date_of_Change <> MIN(Date_of_Change)
也就是說,我只需要為每個Object_ID.
表樣
| 物件_ID | 當前_步 | 改變 | 更改日期 |
|---|---|---|---|
| 0025307 | 空值 | 改變 | 16.11.2021 |
| 0025307 | 空值 | 改變 | 19.11.2021 |
| 0025307 | 空值 | 改變 | 19.11.2021 |
我正在使用 MS SQL。沒有主鍵。所有列的型別VARCHAR除外。Date_of_ChangeDATE
我需要清理這個表的原因是因為它被錯誤地填充,因為源查詢正在檢查 IF NULL = NULL 然后將這些狀態更改標記為已更改,即使它們沒有更改。所以我需要將值恢復到它們被更改的原始日期,因為如果它們仍然具有 NULL 值,則意味著狀態沒有發生實際變化。
期望的行為
我嘗試確定需要保留的行:
SELECT [Object_ID]
,MIN([Date_of_Change])
FROM table
WHERE [Current_Step] IS NULL
AND [Change] = 'change'
GROUP BY Object_ID
我只需要洗掉具有相同 Object_ID 的其他行,其 Date_of_Change 不等于上面查詢中標識的行。
uj5u.com熱心網友回復:
像我在下面的“Table1223”上那樣加入同一張桌子。
例子:
DELETE tbl
FROM Table1223 tbl
JOIN (SELECT * FROM Table1223) objID
ON objID.Object_ID = tbl.Object_ID
WHERE tbl.Date_of_Change > objID.Date_of_Change
uj5u.com熱心網友回復:
架構
因此,您有一個包含版本物件的表,其中包含與物件相關聯的更改記錄以及一些詳細資訊和日期。
現在你要選擇
- 每個物件的第一個更改
- 最舊的(在此物件更改的GROUP內)
MIN在DATE列型別上使用函式
這個最舊的應該保留/保留并留下。應洗掉所有其他物件更改版本。
求解
A. 分兩步選擇每個物件的第一個/最舊的更改。
- 選擇每個物件的 MIN(日期):
SELECT Object_ID, COUNT(Object_ID) AS Count_Changes, MIN(Date_of_Change) AS First_Change
FROM table
GROUP BY Object_ID
結果集包含每個物件以及更改的總數和第一次更改的日期。
- 選擇使用以前的結果作為第一個變化子查詢中
JOIN:
SELECT *
FROM table t
-- join with a table-subquery having only 2 columns to correlate
JOIN (
SELECT Object_ID, MIN(Date_of_Change) AS First_Change
FROM table
WHERE Current_Step is NULL and Change = 'change'
GROUP BY Object_ID
) m ON t.Object_ID = m.Object_ID AND t.Date_of_Change = m.First_Change
WHERE Current_Step is NULL and Change = 'change'
這是要保留而不是洗掉的行。每個物件的第一次更改應保留而不是清除。
B. 現在我們可以反轉 JOIN 條件來獲取我們想要洗掉/清理的所有行:
- 更改日期比較
) m ON t.Object_ID = m.Object_ID AND t.Date_of_Change = m.First_Change
不等于:
) m ON t.Object_ID = m.Object_ID AND t.Date_of_Change <> m.First_Change
- 首先運行干選擇,以在洗掉之前至少獲得計數。
SELECT COUNT(Object_ID) AS records_to_remove
FROM table t
-- join with a table-subquery having only 2 columns to correlate
JOIN (
SELECT Object_ID, MIN(Date_of_Change) AS First_Change
FROM table
WHERE Current_Step is NULL and Change = 'change'
GROUP BY Object_ID
) m ON t.Object_ID = m.Object_ID AND t.Date_of_Change <> m.First_Change
WHERE Current_Step is NULL and Change = 'change'
- 使用 JOIN 準備 DELETE 陳述句(如果 DBMS 支持):
DELETE FROM table t
JOIN (
SELECT Object_ID, MIN(Date_of_Change) AS First_Change
FROM table
WHERE Current_Step is NULL and Change = 'change'
GROUP BY Object_ID
) m ON t.Object_ID = m.Object_ID AND t.Date_of_Change <> m.First_Change
WHERE t.Current_Step is NULL AND t.Change = 'change'
USING在其他 DBMS 上嘗試 JOIN 的替代方法
某些 DBMS 不支持 DELETE 陳述句中的 JOIN,但可以使用以下替代方法USING:
DELETE FROM table t
USING (
SELECT Object_ID, MIN(Date_of_Change) AS First_Change
FROM table t2
WHERE t2.Current_Step is NULL AND t2.Change = 'change'
) AS m
WHERE ...
AND t.Object_ID = m.Object_ID AND t.Date_of_Change <> m.First_Change
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393001.html
標籤:sql sql-server sql-删除
上一篇:每次磁區值更改時的sql視窗函式
