我需要更新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,因为更新语句中不能有多个表
感谢您的帮助
答案 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