【问题标题】:Update 2 tables in one statement (MS SQL) [duplicate]在一个语句中更新 2 个表(MS SQL)[重复]
【发布时间】:2011-09-02 09:44:46
【问题描述】:

可能重复:
How to update two tables in one statement in SQL Server 2005?

我有一个更新声明。它更新一个字段,但在另一个表上进行内部连接以完成 where 子句。我正在使用 MS SQL。

我现在正在尝试更新连接表上的字段,但似乎无法做到。我读过你一次只能更新一个表。这是真的?有没有办法解决这个问题?

这是我的声明

update tbl_calendardatebox
set 
tbl_calendardatebox.HeaderBgColour = @value,
tbl_calendarobjects.Saved = '0'

from tbl_calendardatebox db
inner join tbl_calendarobjects o on
db.ObjectId = o.Id

where o.PageId = @page
and o.GroupField = @group and o.GroupField <> '-1'
and o.Visible = '1'
and o.CanUserEdit = '1'
and db.HeaderBgColour <> @value

所以这两个表是 tbl_calendardatebox 和 tbl_calendarobjects。我在 tbl_calendarobjects.Saved = '0' 上收到错误消息 - 无法绑定多部分标识符“tbl_calendarobjects.Saved”。

任何帮助将不胜感激。

【问题讨论】:

  • 您正在为表格提供别名,但不要使用它们。要么你在这里发帖时弄坏了东西,要么你永远不会让系统税工作。我也不确定是否可以在一个语句中更新多个表,但这是我至少可以立即发现的一件事。
  • 我在集合上提供完全限定的别名,因为它不会在 from 上提取别名。
  • 看我的回答,我经常这样问我数不清了。但是从未尝试过更新多个表,但可以立即工作......不确定。

标签: sql sql-update inner-join


【解决方案1】:

无法同时更新多个表。以下是来自MSDN 的摘要,清楚地表明了

{} 表示必填字段

[] 表示可选字段

[...n] 表示 0 或多个

See this

UPDATE 
        { 
         table_name WITH ( < table_hint_limited > [ ...n ] ) 
         | view_name 
         | rowset_function_limited 
        } 
        SET 
        { column_name = { expression | DEFAULT | NULL } 
        | @variable = expression 
        | @variable = column = expression } [ ,...n ] 

    { { [ FROM { < table_source > } [ ,...n ] ] 

        [ WHERE 
            < search_condition > ] } 
        | 
        [ WHERE CURRENT OF 
        { { [ GLOBAL ] cursor_name } | cursor_variable_name } 
        ] } 
        [ OPTION ( < query_hint > [ ,...n ] ) ] 

以下部分不能包含任何连接。 “{ }”表示必填字段,可以包含视图名称或表名称,但不能包含连接。

{ 
 table_name WITH ( < table_hint_limited > [ ...n ] ) 
 | view_name 
 | rowset_function_limited 
} 

【讨论】:

    【解决方案2】:

    语法修复开始,也可能解决问题,未经测试!

    update db
    set 
    db.HeaderBgColour = @value,
    o.Saved = '0'
    
    from tbl_calendardatebox db
    inner join tbl_calendarobjects o on
    db.ObjectId = o.Id
    
    where o.PageId = @page
    and o.GroupField = @group and o.GroupField <> '-1'
    and o.Visible = '1'
    and o.CanUserEdit = '1'
    and db.HeaderBgColour <> @value
    

    在 stackoverflow 上找到的实际答案:How to update two tables in one statement in SQL Server 2005?

    遗憾的是,这是不可能的。

    【讨论】:

    • 谢谢,但仍然出现 o.Saved 上的错误 = 无法绑定多部分标识符“o.Saved”。
    • 是的,当尝试执行多个表时,很可能无法使用 from 子句进行更新。尝试对 Marco 的建议进行修改。
    【解决方案3】:

    希望这个例子(取自here)可以帮助到你:

    UPDATE a 
    INNER JOIN b USING (id) 
    SET a.firstname='Pekka', a.lastname='Kuronen', 
    b.companyname='Suomi Oy',companyaddress='Mannerheimtie 123, Helsinki Suomi' 
    WHERE a.id=1; 
    

    您的查询(我无法测试,抱歉)可能是:

    UPDATE tbl_calendardatebox cdb
      INNER JOIN tbl_calendarobjects co
        ON cdb.ObjectId = co.Id
    SET cdb.HeaderBgColour = @value
      , co.Saved = '0'
    WHERE co.PageId = @page
    AND co.GroupField = @group 
    AND co.GroupField <> '-1'
    AND co.Visible = '1'
    AND co.CanUserEdit = '1'
    AND cdb.HeaderBgColour <> @value
    

    【讨论】:

    • 感谢 Marco,尽管它在这里抛出了语法错误。它首先在 cdb 'Expecting SET' 上抛出一个错误,这让我相信你不能在 SET 之前进行内部连接。
    • 我个人认为这与USING有关,我个人不知道USING语句(虽然这并不意味着什么!)。请注意,我知道使用 dbname 来指定要在哪个数据库上运行查询,但在加入时我不知道。我在我的帖子中编辑了宏的答案的变体,使用“正常”的声明。
    • 这适用于 MySQL 吗?我忘了说,我使用的是 MS SQL。
    • 您不能在 SQL-Server 的一个语句中更新 2 个表:请参阅此答案以获得解决方案:stackoverflow.com/questions/2044467/…
    • 啊啊啊!我也把它联系起来了 :( 但是,可悲的是,不可能。
    【解决方案4】:

    就像 Shantanu 所说,不可能更新多个表。 无论如何,如果你的环境允许,你可以走程序的方式。 它是安全的和原子的。请记住,在捕获错误时,总是回滚。

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 2013-12-21
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2011-03-04
      • 2014-07-22
      相关资源
      最近更新 更多