Sql 如果更新发现多个值,为什么不失败?

Sql 如果更新发现多个值,为什么不失败?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果使用带有FROM语句的别名进行更新,并且FROM语句中使用的联接意味着SET操作将有多个可能的值,那么为什么SQL Server允许进行更新?它似乎是从一组可能的值中选择最高值,但这不可能是一个一致的方法,那么为什么该语句没有失败呢 例如: CREATE TABLE #Updated (ID_Unq INT, Value CHAR(1)); CREATE TABLE #UpdateFrom (ID_Non_Unq INT, Value CHAR(1)); INSERT INTO #Upd

如果使用带有FROM语句的别名进行更新,并且FROM语句中使用的联接意味着SET操作将有多个可能的值,那么为什么SQL Server允许进行更新?它似乎是从一组可能的值中选择最高值,但这不可能是一个一致的方法,那么为什么该语句没有失败呢

例如:

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;

SQL将允许许多不确定的操作
如果没有order by子句,返回的订单可能会更改
处理的第一(和最后)行可能会更改

而不是让SQL guess执行只返回单个值的更新

e、 g

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; 

我明白你的意思了-UPDATE语句似乎只对JOIN操作中的给定行应用一个操作。如果将OUTPUT子句添加到UPDATE,则只会看到3行被更新。这与SELECT不同,SELECT将显示连接的6行。我怀疑这是SQL Server试图最好地理解您要求它执行的操作,因此它不是对每一行应用两个更新,而是对操作应用“快捷方式”,并对正在更新的表中给定的行应用第一个联接结果。这很可能是出于性能原因。使用找到的第一条记录进行更新比在执行更新之前检查是否有多个值要快。不过这只是一个猜测。添加“输出”更新:ID_Unq='+CAST(INSERTED.ID_Unq as varchar(10))++'+DELETED.Value+'=>'+INSERTED.Value',低于设置值=。。声明将显示所应用的更新,这可能会更清楚地说明发生了什么,但我不能回答为什么,但我可以指出:“在指定FROM子句以提供更新操作的条件时,请小心。如果UPDATE语句包含FROM子句,而FROM子句的指定方式不是每次更新的列出现时只有一个值可用,即UPDATE语句不是确定性的,则UPDATE语句的结果是未定义的。“鉴于它是对
UPDATE
的非标准扩展,它可能只是”遗留原因“@AllanS.Hansen-“没有强制执行选择顺序的索引/键”-没有这样的东西。强制执行选择顺序的唯一东西是
order BY
子句。