這里是源表和目標表的樣本。我只有一個名為 "Premise_ID "的唯一ID。我想根據Premise ID來更新目標表。當我運行下面提到的SQL查詢時,我得到一個錯誤,如下所述。我有多條具有相同Premise_ID但具有不同列屬性的記錄。如果第一條Premise_ID匹配,則更新所有的列屬性。有什么方法可以克服這個錯誤嗎?
源表
目標表
SQL查詢
。SQL查詢:
USE GIS_NewJersey
帳號
WITH Source AS (
SELECT Premise_ID, Division, InstallationType
FROM sde.SAP_Load_test
),
目標 AS (
SELECT Premise_ID, Division, InstallationType
FROM sde.PREMISE_test
)
MERGE 目標t
USING Source s
ON t.Premise_ID = s.Premise_ID
WHEN MATCHED THEN
UPDATE SET
Division = s.Division,
安裝型別 = s.安裝型別
WHEN NOT MATCHED THEN
INSERT (Premise_ID, Division, InstallationType)
VALUES (s.Premise_ID, s.Division, s.InstallationType)
;
ERROR:
MERGE陳述句試圖對同一行進行多次UPDATE或DELETE。當一條目標行與多條源行匹配時,就會發生這種情況。MERGE陳述句不能多次UPDATE/DELETE目標表的同一行。完善ON子句以確保目標行最多匹配一條源行,或者使用GROUP BY子句來分組源行。
uj5u.com熱心網友回復:
你可以在MERGE SEARCH CONDITIONS中使用3列,并使用WHEN NOT MATCHED BY TARGET來INSERT和WHEN NOT MATCHED BY SOURCE來DELETE
USE GIS_NewJersey
帳號
WITH Source AS (
SELECT Premise_ID, Division, InstallationType
FROM sde.SAP_Load_test
),
目標 AS (
SELECT Premise_ID, Division, InstallationType
FROM sde.PREMISE_test
)
MERGE 目標t
USING Source s
ON t.Premise_ID = s.Premise_ID
AND t.Division = s.Division
AND t.InstallationType = s.InstallationType
WHEN NOT MATCHED BY TARGET THEN
INSERT (Premise_ID, Division, InstallationType)
VALUES (s.Premise_ID, s.Division, s.InstallationType)
WHEN NOT MATCHED BYSOURCE THEN
洗掉。
;
uj5u.com熱心網友回復:
對于本質上是一個非常基本的 "如果存在就更新,否則就插入"(或 "UPSERT")的問題,MERGE是有問題的,而且是不必要的復雜。我整理了一個頁面,鏈接到幾篇警告性文章和替代方法:
下面是我建議你處理你的邏輯的方法,使用單獨的、更容易排除故障的更新和插入命令(MERGE給人一種是一個操作的假象,但它不是):
BEGIN TRANSACTION;
UPDATE pt WITH (UPDLOCK, SERIALIZABLE)
SET Division = s.Division。
InstallationType = s.InstallationType
FROM sde.PREMISE_test AS pt
INNER JOIN sde.SAP_Load_test AS s
ON pt.Premise_ID = s.Premise_ID。
INSERT sde.PREMISE_test(Premise_ID, Division, InstallationType)
SELECT s.Premise_ID, s.Division, s.InstallationType
FROM sde.SAP_Load_test AS s
WHERE NOT EXISTS (SELECT 1 FROM sde. 實驗
WHERE Premise_ID = s.Premise_ID)。)
COMMIT TRANSACTION;
- 示例 db<>fiddle/li>
但是有一個問題,因為不清楚你是否想在目標表中為任何給定的 Premise_ID 最終獲得多條記錄(雖然你說 一個名為 "Premise_ID "的唯一 id,但你說的其他事情表明你想要多條記錄)。在這個謎題中,目標表中8000004592的行已經被源表中的一個任意行更新了(實際上,它被更新了三次,這只是 "最后 "一次--以某種不確定的順序)。你也沒有解釋,如果源檔案中有兩個8000004594的值,你希望發生什么--同樣,如果在目標檔案中有一個唯一的約束,它應該選擇哪一行?表是一個無序的行包,所以 "第一個"、"最后一個"、"下一個 "和 "上一個 "的概念沒有任何意義,除非你給它一些確定的含義。
如果你打算無視這個建議,繼續使用 MERGE,即使在閱讀(或不閱讀)所有的鏈接之后,至少請將 HOLDLOCK 放在目標位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/332784.html
標籤:


