2015-02-10 57 views
1

如果使用帶有FROM語句的別名進行更新,並且在FROM語句中使用的JOIN意味着SET操作將有多個可能的值,那麼爲什麼SQL Server允許UPDATE發生?它似乎從可能的集合中挑選出最高價值,但這不可能是一致的方法,那麼爲什麼該聲明不會失敗呢?如果UPDATE找到多個值,爲什麼它不會失敗?

實施例:

CREATE TABLE #Updated (ID_Unq INT, Value CHAR(1)); 

CREATE TABLE #UpdateFrom (ID_Non_Unq INT, Value CHAR(1)); 

INSERT INTO #Updated (ID_Unq, Value) VALUES 
(1,'A'), 
(2,'B'), 
(3,'C'); 

INSERT INTO #UpdateFrom (ID_Non_Unq, Value) VALUES 
(1,'A'), 
(1,'B'), 
(2,'C'), 
(2,'D'), 
(3,'E'), 
(3,'F'); 

SELECT * 
FROM #Updated a 
JOIN #UpdateFrom b ON a.ID_Unq = b.ID_Non_Unq; 

UPDATE a 
SET Value = b.Value 
FROM #Updated a 
JOIN #UpdateFrom b ON a.ID_Unq = b.ID_Non_Unq; 

SELECT * FROM #Updated; 
+0

我看到你說的話 - UPDATE語句似乎只有一個操作從JOIN操作適用於給定行。如果將OUTPUT子句添加到UPDATE,則只會看到3行被更新。這不同於將從連接中顯示6行的SELECT。我懷疑這是SQL Server試圖最好地理解你要求它做什麼,因此而不是對每一行應用2次更新,而是簡單地對操作進行「快捷操作」,並將第一個JOIN結果應用於表中的給定行更新。 – Elliveny 2015-02-10 10:53:09

+0

這可能是出於性能原因。使用找到的第一條記錄進行更新比在執行更新之前檢查是否有多個值更快。這只是一個猜測。 – 2015-02-10 10:53:58

+0

在SET Value = ..語句下面添加'OUTPUT'UPDATE:ID_Unq ='+ CAST(INSERTED.ID_Unq as varchar(10))+''+ DELETED.Value +'=>'+ INSERTED.Value'將顯示更新這可能會使得它更清晰 – Elliveny 2015-02-10 10:54:36

回答

1

SQL將允許許多非確定性操作
在不存在order by子句的返回的順序可以改變
第一(和最後)處理行可以改變

而不是讓SQL猜測執行只返回單個值的更新

例如

UPDATE a 
SET Value = max(b.Value) 
FROM #Updated a 
JOIN #UpdateFrom b ON a.ID_Unq = b.ID_Non_Unq 
GROUP BY a.Value; 
相關問題