首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么/如何使用这个不明确的UPDATE语句?

为什么/如何使用这个不明确的UPDATE语句?
EN

Stack Overflow用户
提问于 2009-02-06 15:42:59
回答 2查看 4.4K关注 0票数 3

假设您正在一个表上运行一个UPDATE语句,但是您要放到这个基表中的信息来自于其他一些辅助表。通常,您将加入数据,而不期望UPDATE语句的FROM子句中的行乘,保持一个新行映射到基表中的一个旧行。

但是我想知道,如果连接表在某种程度上是不明确的,就像您不能解释每个基本实体只映射到一个已连接的实体,会发生什么情况。或者,如果您做了一些荒谬的事情,比如连接到基表,连接到它的子表的一个表,并使用该信息更新基表。它会怎么选择?现在,每个基表行有多个行。

我在Server 2005中运行了这样的语句,它似乎正在选择每组中的第一行。但这对我来说是不对的。它不应该引发一个错误吗?为什么这是想要的行为?

示例代码

代码语言:javascript
复制
-- normal
-- categories are one-to-many bundles

update bundles_denormalized set category = c.description

from bundles_denormalized b
left join categories c
on b.category_id = c.id

-- ambiguous
-- bundles are one-to-many products

update bundles_denormalized set category = p.description

from bundles_denormalized b
left join products p
on b.id = p.bundle_id
EN

回答 2

Stack Overflow用户

发布于 2009-02-06 15:58:50

实际上,如果我正确地理解了这个问题,它会多次更新字段,只是因为只有一条记录,所以它最后只有一个值。为什么不出错?因为语法是正确的,而且数据库无法知道您的意图是什么。你想这么做吗?通常情况下,这就是为什么您应该在运行更新之前对其进行选择,以确保corret记录得到正确的值。

我通常以这样的方式使用join编写更新:

代码语言:javascript
复制
update b    
set category = p.description
--select b.category, p.description
from bundles_denormalized b
left join products p on b.id = p.bundle_id

我对在更新中使用左联接也很谨慎,因为您可能会将值更改为nulls。如果这是你想要的,那也没关系,但如果不是这样的话,那就不行了。

票数 5
EN

Stack Overflow用户

发布于 2009-10-05 14:03:41

实际上我只是注意到在我的情况下它做了一些非常愚蠢的事情。我的目的是创建一个单独的行选择,但显然存在一些我没有预料到的重复。在本例中,它实际上将混合数据输入到目标行中,从第一个源行中选择一些列,从第二个源行中选择一些列。

我非常肯定,如果有人试图做一些像这样模棱两可的事情,Firebird会抛出一个异常。但火鸟不支持(非标准?)从X加入Y开始更新X.

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

https://stackoverflow.com/questions/520778

复制
相关文章

相似问题

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