我有兩個表:表 A 和表 B。假設 B 包含來自 A 的所有 Id,然后當我每次運行查詢時,我需要檢查 A 中尚未包含在 B 中的新添加的 Id,然后插入他們給 B. A 每天都在更新,每一行都有一個唯一的 ID。
我只需要記錄從 A 到 B 的 4 列(Id、Region、Department、EntryDate),EntryDate 是將 Id 添加到 B 的日期。B 用作 Id 何時以及何時首次出現在 A 中的歷史記錄.
將這些新資料從 A 插入到 B 的查詢是什么?
uj5u.com熱心網友回復:
要識別新值,您應該將新列添加到table A名為0的名稱IsTransfered中。default
Alter Table A Add IsTransfered BIT Default(0)
然后使用此查詢創建一個作業以傳輸新值。
Begin Transaction
Begin Try
DECLARE @InsertedIDs Table (ID Int)
Insert B (Id, Region, Department, EntryDate)
Select Id, Region, Department, EntryDate
Output inserted.Id INTO @InsertedIDs
From A
Where IsTransfered = 0
Update A
SET IsTransfered = 1
FROM @InsertedIDs I
INNER JOIN A ON I.ID = A.Id
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
正如您在查詢中看到的那樣,它會 IsTransfered在傳輸新記錄后更新。它必須在交易中。
要獲得更多性能增益,請創建過濾索引:
CREATE NONCLUSTERED INDEX IX_FilterdByIsTransfered
ON A (ID)
WHERE IsTransfered = 0;
uj5u.com熱心網友回復:
你能創建一個視圖嗎?這樣就不需要運行任何作業,并且它們將始終保持同步。
create view b as
Select Id, Region, Department, min(EntryDate) as EntryDate
from a
group by Id, Region, Department
uj5u.com熱心網友回復:
使用EXCEPT 運算子獲取表 A 中的新 ID,然后使用where .. IN和select將資料插入表 B,如下所示。
INSERT INTO B (Id, Region, Department, EntryDate)
---select new IDs and it's associated values from table a
SELECT Id,
Region,
Department,
EntryDate
FROM A
WHERE id IN(
SELECT DISTINCT id --get new IDs in table a
FROM A
EXCEPT
SELECT DISTINCT id
FROM B)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438761.html
