如果 UPDATE 语句包含了未指定每个更新列的位置只有一个可用值的 FROM 子句(换句话说,如果 UPDATE 语句是不确定性的),则其结果将不明确。例如,对于下面脚本中的 UPDATE
语句,Table1
中的全部两行都满足 UPDATE
语句中 FROM
子句的限定条件;但是,将使用 Table1
的哪一行来更新 Table2.
中的行是不明确的。
use test
go
create table A(ie int, sex varchar(10), age int)
insert A select 1,'男',50
union all select 2,'女',33
create table B(id int, sex varchar(10), age int)
insert B select 1,'男',67
union all select 1,'女',43
update A set age=B.age from B where ie=B.id
select * from A
select * from a,b where A.id=B.id
go
drop table a
drop table b
go
当结合使用 FROM 和 WHERE CURRENT OF 子句时,可能发生同样的问题。在以下示例中,Table2
中的全部两行都满足 UPDATE
语句中 FROM
子句的限定条件。将使用 Table2
的哪一行来更新 Table1
中的行是不明确的。
一条 UPDATE 语句永远不会对同一行更新两次
一条 UPDATE 语句永远不会对同一行更新两次如果所更新对象与 FROM 子句中的对象相同,并且在 FROM 子句中对该对象只有一个引用,则指定或不指定对象别名均可。如果更新的对象在 FROM 子句中出现了不止一次,则对该对象的一个(且仅仅一个)引用不能指定表别名。FROM 子句中对该对象的所有其他引用都必须包含对象别名。