假设您正在一个表上运行一个UPDATE语句,但是您要放到这个基表中的信息来自于其他一些辅助表。通常,您将加入数据,而不期望UPDATE语句的FROM子句中的行乘,保持一个新行映射到基表中的一个旧行。
但是我想知道,如果连接表在某种程度上是不明确的,就像您不能解释每个基本实体只映射到一个已连接的实体,会发生什么情况。或者,如果您做了一些荒谬的事情,比如连接到基表,连接到它的子表的一个表,并使用该信息更新基表。它会怎么选择?现在,每个基表行有多个行。
我在Server 2005中运行了这样的语句,它似乎正在选择每组中的第一行。但这对我来说是不对的。它不应该引发一个错误吗?为什么这是想要的行为?
示例代码
-- 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发布于 2009-02-06 15:58:50
实际上,如果我正确地理解了这个问题,它会多次更新字段,只是因为只有一条记录,所以它最后只有一个值。为什么不出错?因为语法是正确的,而且数据库无法知道您的意图是什么。你想这么做吗?通常情况下,这就是为什么您应该在运行更新之前对其进行选择,以确保corret记录得到正确的值。
我通常以这样的方式使用join编写更新:
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。如果这是你想要的,那也没关系,但如果不是这样的话,那就不行了。
发布于 2009-10-05 14:03:41
实际上我只是注意到在我的情况下它做了一些非常愚蠢的事情。我的目的是创建一个单独的行选择,但显然存在一些我没有预料到的重复。在本例中,它实际上将混合数据输入到目标行中,从第一个源行中选择一些列,从第二个源行中选择一些列。
我非常肯定,如果有人试图做一些像这样模棱两可的事情,Firebird会抛出一个异常。但火鸟不支持(非标准?)从X加入Y开始更新X.
https://stackoverflow.com/questions/520778
复制相似问题