2015-06-18 2 views
2

У меня есть 2 таблицы, мне нужно обновить:Как обновить несколько таблиц с одним запросом

Таблица A состоит из: ID, PERSONNAME, дата, статус

Таблица B состоит из: PersonId, дата, статус

для каждой строки в а может быть несколько строк в B с тем же PersonId

мне нужно «петля» по всем результатам из а, что статус = 2 и обновить дату и статус 1.

Кроме того, для каждой строки в A, которая имеет статус = 2, мне нужно обновить все строки в B, которые имеют один и тот же идентификатор person (то есть 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() 

я знаю, как обновить все строки в B, используя следующую инструкцию SQL:

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

проблема заключается в том, что я не знаю, как и обновить таблицу А поскольку не может быть несколько таблиц в операторе обновления

спасибо за любую помощь

+0

Y ou может обновить первую таблицу, используя предложение 'OUTPUT', чтобы фиксировать обновляемые записи. Затем используйте эту информацию для обновления второй таблицы. –

+0

Почему бы просто не написать 2 заявления об обновлении? вы можете поместить их внутри транзакции, если вам нужны все или ничего. –

ответ

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); 
+0

thx! что мне нужно. обратите внимание, что OUTPUTstatment должен быть до WHERE statemnet – Dardar

0

Вопрос был задан до:

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; 
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 
Смежные вопросы