我有一个场景,我想只使用一个实例更新多个表中的多个字段。我需要一个语法来对多个数据库(Oracle和MSSQL)执行此类操作。
目前我被MSSQL的以下声明所困:
update table1
set table1.value = 'foo'
from table1 t1 join table2 t2 on t1.id = t2.tab1_id
where t1.id = 1234
我想更新t2中的字段以及同一声明。
此外,我想在Oracle上执行相同的更新。
编辑:左看起来我只能在一个语句中更新多个表。
是否有一种语法适用于使用Oracle和MSSql进行更新时加入?
此致
答案 0 :(得分:0)
在Oracle上,您只能更新一个表,但您可以考虑使用触发器。
答案 1 :(得分:0)
好像我无法更新多个 只有一个陈述中的表格。
是否有适用的语法 使用a更新时的Oracle和MSSql 加入?
我假设当您重新提出问题时,您希望语法可以在Oracle和SQL Server上运行,即使它不可避免地只会影响一个表。
两个平台都支持入门级SQL-92标准代码,因此以下“标量子查询”SQL-92代码应该可以工作:
UPDATE table1
SET my_value = (
SELECT t2.tab1_id
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
)
WHERE id = 1234
AND EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);
请注意,虽然t1
使用Ttble1
的相关名称是有效的语法,但根据SQL-92标准,这将实现表格,然后UPDATE
将定位物化表格“ t1'并使你的基表'table1`不受影响,我认为这不是理想的影响。虽然我非常确定Oracle和SQL Server都不符合这一点,并且在实践中可以按预期工作,但是通过完全限定目标表来保持超级谨慎并坚持SQL-92语法并没有坏处。
更新版本的Oracle和SQL Server支持都支持标准SQL:2003 MERGE
语法,可能会使用与此类似的内容:
MERGE INTO table1
USING (
SELECT t2.tab1_id
FROM table2 AS t2
) AS source
ON id = source.tab1_id
AND id = 1234
WHEN MATCHED THEN
UPDATE
SET my_value = source.tab1_id;
我刚刚注意到你的例子比我最初想的更简单,只需要一个应该在大多数SQL产品上运行的简单子查询,例如:
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);