【问题标题】:How to update multiple tables with single query如何使用单个查询更新多个表
【发布时间】:2015-06-18 12:08:36
【问题描述】:

我有 2 个表需要更新:

表 A 包括:ID、人名、日期、状态

表 B 包括:PersonID、Date、status

对于 A 中的每一行,B 中可以有多个具有相同 personID 的行

我需要“循环”来自 A 且 status=2 的所有结果,并将日期和状态更新为 1。

此外,对于 A 中 status=2 的每一行,我需要更新 B 中具有相同 personID(即 A.ID==B.PersonID)的所有行——我需要将日期和状态更新为 1也是。

所以基本上,如果我要以编程方式(或算法)执行此操作,它就是这样的:

Foreach(var itemA in A)
    If (itemA.status = 2)
        itemA.status to 1
        itemA.date = GetDate()
        foreach(var itemB in B)
            if(itemB.PersonID == itemA.ID && itemB.status != 2 )
                Change itemB.status to 1
                Change itemB.date = GetDate()

我知道如何使用以下 sql 语句更新 B 中的所有行:

UPDATE 
   B
SET
   status = 1, 
   date = GETDATE()
FROM
    B
INNER JOIN
    A
ON
  B.PersonID = A.ID

问题是我不知道如何更新表 A,因为更新语句中不能有多个表

感谢您的帮助

【问题讨论】:

  • 您可以使用OUTPUT 子句更新第一个表来捕获正在更新的记录。然后使用此信息更新第二个表。
  • 为什么不简单地写两条更新语句呢?如果您需要全部或全部不需要,您可以将它们放入事务中。

标签: sql sql-server


【解决方案1】:

以下是使用output 子句的示例:

declare @ids table (id int);

update table1
    set status = 1
    output inserted.id into @ids
    where status = 2;

update table2
    set status = 1,
        date = getdate()
    where personid in (select id from @ids);

【讨论】:

  • 谢谢!正是我需要的。请注意,OUTPUTstatment 应该在 WHERE statemnet 之前
【解决方案2】:

将所有内容放入事务中,如果成功则提交

DECLARE @err int
BEGIN TRANSACTION
UPDATE B
SET status = 1,  date = GETDATE()
FROM B INNER JOIN A ON B.PersonID = A.ID
WHERE A.status = 2
SET @err = @@ERROR

IF @err = 0
BEGIN
UPDATE A
SET status = 1, 
    date = GETDATE()
WHERE status = 2
SET @err = @@ERROR
END

IF @err = 0
COMMIT 
ELSE ROLLBACK

【讨论】:

    【解决方案3】:

    之前有人问过问题:

    How to update two tables in one statement in SQL Server 2005?

    一次更新多个表是不可能的。

    该问题的摘要答案:

    您不能在一个语句中更新多个表,但是,您可以使用事务来确保以原子方式处理两个 UPDATE 语句。您还可以对它们进行批处理以避免往返。

    BEGIN TRANSACTION;
    
    UPDATE Table1
    SET Table1.LastName = 'DR. XXXXXX' 
    FROM Table1 T1, Table2 T2
    WHERE T1.id = T2.id
    and T1.id = '011008';
    
    UPDATE Table2
    SET Table2.WAprrs = 'start,stop'
    FROM Table1 T1, Table2 T2
    WHERE T1.id = T2.id
    and T1.id = '011008';
    
    COMMIT;
    

    对于您的问题,这样的事情会起作用:

    BEGIN TRANSACTION;
    
    UPDATE B
    SET status = 1
    ,   date   = GETDATE()
    WHERE B.PersonId IN ( SELECT ID 
                          FROM A
                          WHERE A.status = 2
                        );
    
    UPDATE A
    SET status = 1
    ,   date   = GETDATE()
    WHERE A.status = 2;
    
    COMMIT;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多