来自T-SQL中一个源列表的多个表更新

时间:2014-04-09 10:04:11

标签: sql sql-server-2008 tsql

我有3个表格,我希望UPDATE数据反对(让我们称之为PROCESSDIARYHISTORY

3个表都有一个ID列,我希望更新的数据子集是从SELECT表中的PROCESS语句中检索的

SELECT ID FROM PROCESS WHERE STATUS = 1 AND COMPANY = 'XYZ'

使用T-SQL,我打算做3个UPDATE语句(PROCESS表是最后一个,因为它是参考列表),如此

UPDATE HISTORY ... WHERE ID IN (SELECT ID FROM PROCESS WHERE STATUS = 1 AND COMPANY = 'XYZ')
UPDATE DIARY ... WHERE ID IN (SELECT ID FROM PROCESS WHERE STATUS = 1 AND COMPANY = 'XYZ'
)
UPDATE PROCESS ... WHERE STATUS = 1 AND COMPANY = 'XYZ'

我的问题是:这是在T-SQL中执行此操作的最有效方法 - 还是应该创建某种CTE以仅引用一次? (文档/性能的数量不是问题,我只是想弄清楚作为一个前OO开发人员是否会进入SQL,我会陷入坏习惯或在某个地方错过一个技巧

1 个答案:

答案 0 :(得分:3)

我认为您无法使用CTE,因为CTE只能被引用一次。更新3个表需要运行3个单独的查询。

如果在内部查询中获取ID很昂贵,您可以考虑运行查询以仅获取一次并将结果存储在临时表或表变量中。这样,您就可以在所有更新语句中引用该临时表或表变量。

如果内部查询运行成本低廉,我会保留原样,以免造成不必要的复杂化。