當我們將新記錄加載到我們的系統上時,我們首先將它們保存在一個臨時loadedRecords表中,在那里我們嘗試將它們與系統上的現有記錄相匹配。
一旦加載的記錄與現有記錄匹配,我們更新加載的記錄以參考現有記錄的 id,但是可能存在多個“相同”記錄,即具有相同匹配條件的多個記錄,我可以'找不到一種方法來做到這一點,以便每個現有記錄都匹配到不同的加載記錄。
DB<>小提琴
我目前有這個:
UPDATE loadedRecords
SET recordID = r.id
FROM loadedRecords
JOIN records as r
ON r.amount = loadedRecords.amount
WHERE loadedRecords.recordID IS NULL
但是,這會導致所有 3 個加載的記錄與 a amountof400匹配到第一個現有記錄的 a amountof 400:
| ID | 數量 | 記錄ID |
|---|---|---|
| 1 | 400 | 1 |
| 2 | 500 | 4 |
| 3 | 400 | 1 |
| 4 | 400 | 1 |
請注意, ids 1、3和4都與 recordID 匹配1。我想要的結果是:
| ID | 數量 | 記錄ID |
|---|---|---|
| 1 | 400 | 1 |
| 2 | 500 | 4 |
| 3 | 400 | 2 |
| 4 | 400 | 3 |
匹配的確切順序無關緊要,只要每條現有記錄只匹配一條加載的記錄,并且每條加載的記錄只匹配一條現有記錄。
也有可能加載不匹配的記錄,包括存在比匹配“相同”現有記錄更多的“相同”加載記錄的可能性(例如,如果有 4 個加載的記錄,數量為400,但只有 3 個現有記錄具有該數量的記錄)這些額外加載的
記錄應該不匹配recordIDNULL
uj5u.com熱心網友回復:
如果您使用一個簡單的技巧,即 ROW_NUMBER() 視窗函式,這實際上很容易做到。使用此函式,我們可以在新列中為每組 amt 值賦予一個從 1 開始的唯一整數。這是為您的表執行此操作的代碼:
SELECT *, ROW_NUMBER() OVER (PARTITION BY amount) AS RN
FROM loadedRecords
SELECT *, ROW_NUMBER() OVER (PARTITION BY amount) AS RN
FROM records
現在我們只需要這兩個并加入他們
UPDATE loadedRecords
SET recordID = r.id
FROM loadedRecords
JOIN (
SELECT id, amount, ROW_NUMBER() OVER (PARTITION BY amount) AS RN
FROM records
) r ON r.amount = loadedRecords.amount AND
r.RN = ROW_NUMBER() OVER (PARTITION BY loadedRecords.amount)
WHERE loadedRecords.recordID IS NULL
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/492347.html
上一篇:具有多個一對多關系的復雜連接
下一篇:將嵌套陣列轉換為雪花中的列
