首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在多行上更新和连接,使用哪一行的值?

在多行上更新和连接,使用哪一行的值?
EN

Stack Overflow用户
提问于 2012-03-01 00:02:01
回答 4查看 23.7K关注 0票数 29

假设我有以下语句,内部连接产生了3行,其中a.Id = b.Id,但这3行中的每一行都有不同的b.Value。由于只更新了tableA中的一行,所以更新中使用了这3个值中的哪一个?

代码语言:javascript
复制
UPDATE a
SET a.Value = b.Value
FROM tableA AS a
INNER JOIN tableB as b 
ON a.Id = b.Id
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-01 00:28:07

我不认为这种情况是有规则的,你不能依赖于一个特定的结果。

如果你想查找特定的行,比如最近的行,你可以使用apply,如下所示:

代码语言:javascript
复制
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
票数 19
EN

Stack Overflow用户

发布于 2012-03-01 00:33:12

通常,在这种情况下,您最终得到的是按照表中物理索引的顺序出现的第一行。在实际操作中,您应该将此视为非确定性,并包含将结果缩小到一行的内容。

票数 7
EN

Stack Overflow用户

发布于 2012-03-01 00:32:12

以下是我在使用SQL Server 2008时想出的方法

代码语言:javascript
复制
--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提出的解决方案,以确保您知道要选择的值。

简而言之,不要相信默认实现,创建自己的实现。但是,这是一个有趣的学术问题:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9502449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档