如何使用单个查询更新多个表

时间:2015-06-18 12:08:37

标签: sql sql-server

我需要更新2个表:

表A包括:ID,personName,日期,状态

表B包括:PersonID,日期,状态

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

我需要“循环”来自状态= 2的A的所有结果,并将日期和状态更新为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,因为更新语句中不能有多个表

感谢您的帮助

3 个答案:

答案 0 :(得分:5)

以下是使用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);

答案 1 :(得分:1)

之前已经提出过问题:

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

无法一次更新多个表。

该问题的总结答案:

您无法在一个语句中更新多个表,但是,您可以使用事务来确保以原子方式处理两个UPDATE语句。您也可以批量处理它们以避免往返。

public function getCardValues()
{
    $collection = new ArrayCollection();

    if (!$this->cardAttrSet) {
        return $collection;
    }

    // Add existing values
    foreach ($this->card_values as $value) {
        $collection[$value->getCardAttribute()->getId()] = $value;
    }

    // Get all attributes from the set and create values for missing attributes
    foreach ($this->cardAttrSet->getAttributes() as $attr) {
        if (!isset($collection[$attr->getId()])) {
            $value = new cardAttrValue();
            $value->setCardAttribute($attr);

            $collection[$attr->getId()] = $value;
        }
    }

    return $collection;
}

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

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;

答案 2 :(得分:1)

将所有内容放入事务中并在成功时提交

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