假设我有以下语句,内部连接产生了3行,其中a.Id = b.Id,但这3行中的每一行都有不同的b.Value。由于只更新了tableA中的一行,所以更新中使用了这3个值中的哪一个?
UPDATE a
SET a.Value = b.Value
FROM tableA AS a
INNER JOIN tableB as b
ON a.Id = b.Id
发布于 2012-03-01 00:28:07
我不认为这种情况是有规则的,你不能依赖于一个特定的结果。
如果你想查找特定的行,比如最近的行,你可以使用apply
,如下所示:
UPDATE a
SET a.Value = b.Value
FROM tableA AS a
CROSS APPLY
(
select top 1 *
from tableB as b
where b.id = a.id
order by
DateColumn desc
) as b
发布于 2012-03-01 00:33:12
通常,在这种情况下,您最终得到的是按照表中物理索引的顺序出现的第一行。在实际操作中,您应该将此视为非确定性,并包含将结果缩小到一行的内容。
发布于 2012-03-01 00:32:12
以下是我在使用SQL Server 2008时想出的方法
--drop table #b
--drop table #a
select 1 as id, 2 as value
into #a
select 1 as id, 5 as value
into #b
insert into #b
select 1, 3
insert into #b
select 1, 6
select * from #a
select * from #b
UPDATE #a
SET #a.Value = #b.Value
FROM #a
INNER JOIN #b
ON #a.Id = #b.Id
它似乎每次都使用基本select的顶值( select * from #b的第1行)。所以,它可能依赖于索引。但是,我不会依赖SQL设置的实现,因为这是有可能改变的。相反,我建议使用Andomar提出的解决方案,以确保您知道要选择的值。
简而言之,不要相信默认实现,创建自己的实现。但是,这是一个有趣的学术问题:)
https://stackoverflow.com/questions/9502449
复制相似问题