Обновление нескольких таблиц в одном операторе обновления с левым соединением - PullRequest
2 голосов
/ 14 сентября 2010

Я понимаю, что то, о чем я прошу, может быть невозможным.Я хочу выполнить ОБНОВЛЕНИЕ для двух отдельных таблиц, основанных на LEFT JOIN и предложении WHERE.Это моя попытка:

UPDATE  PERIODDATES as pd, periods2 as p2
SET     pd.[PERIODCODE] = @PERIODCODE,
     p2.[USERCODE] = @USERCODE
             left join periods2 AS p2
    ON  pdates.schemeid = p2.schemeid AND

WHERE [SCHEMEID] = @SCHEMEID

Возможно ли это?

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

Это невозможно. Вы можете обновить только одну таблицу в одном операторе. Вам придется разделить это на два утверждения.

Edit:

Обновление двух таблиц в одном операторе действительно возможно, но потребуется создать представление с использованием UNION, содержащего обе таблицы, которые вы хотите обновить. Затем вы можете обновить представление, которое затем обновит базовые таблицы.

Мне кажется, что это немного взломано, но это сработает.

2 голосов
/ 26 апреля 2012

Здесь можно восстановить старый вопрос, но ... вы можете смоделировать обновление нескольких таблиц в одном запросе с помощью двух запросов UPDATE, заключенных в транзакцию.Таким образом, вам не нужно запутываться, используя обновляемые представления, и никакие изменения не будут сделаны, если обе таблицы не обновятся успешно:

BEGIN TRANSACTION

UPDATE PERIODDATES AS pd
SET pd.PeriodCode = @PeriodCode
WHERE [SCHEMEID] = @SCHEMEID;

UPDATE periods2 AS pd2
SET pd2.[USERCODE] = @USERCODE
WHERE [SCHEMEID] = @SCHEMEID;

COMMIT;

для ваших вставок, вы можете использовать либо @@ IDENTITY, либо OUTPUTINTO, чтобы получить идентификатор новой записи для использования во второй таблице, например:

DECLARE @ID int;

BEGIN TRANSACTION

INSERT INTO PERIODDATES( PeriodCode ) AS pd
VALUES ( @PeriodCode )
WHERE [SCHEMEID] = @SCHEMEID;

SELECT @ID = @@IDENTITY;

INSERT INTO periods2( [SCHEMEID], [USERCODE] ) AS pd2
VALUES ( @ID, @USERCODE );

COMMIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...