使用左连接更新单个更新语句中的多个表

时间:2010-09-14 09:57:46

标签: sql-server sql-server-2005 tsql

我意识到我所要求的可能是不可能的。我想基于LEFT JOIN和WHERE子句在两个单独的表上执行UPDATE。这是我的尝试:

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 个答案:

答案 0 :(得分:4)

这是不可能的。您只能在一个语句中更新一个表。你必须把它分成两个陈述。

编辑:

实际上可以在一个语句中更新两个表,但需要使用包含要更新的表的UNION来创建视图。然后,您可以更新View,然后更新基础表。

对我来说这似乎有点黑客但它会起作用。

答案 1 :(得分:2)

在这里复制一个旧问题,但是......你可以通过包含在事务中的两个UPDATE查询来模拟在单个查询中更新多个表。这样您就不必使用up-datable视图变得混乱,除非两个表都成功更新,否则不会进行任何更改:

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或OUTPUT INTO来获取要在第二个表中使用的新记录的ID,即:

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;