适用于主要数据库的更新语法
UPDATE syntax that works in major databases
我想根据另一个 table (source
) 中存在的值更新 table (target
)。但我正在寻找一种适用于 4 个主要数据库的语法 - Oracle、MS SQL Server、PostgreSQL、MySQL.
到目前为止,我还没有找到这样一个统一的语法。是我错过了这样的语法还是真的没有这样的语法?
甲骨文
UPDATE target t
SET (t.col1, t.col2) = (SELECT s.col1, s.col2
FROM source s
WHERE s.key = t.key)
MS SQL 服务器/PostgreSQL
UPDATE target t
SET t.col1 = s.col1, t.col2 = s.col2
FROM source s
WHERE t.key=s.key
MySQL
UPDATE target, source
SET t.col1=s.col1, t.col2=s.col2
WHERE s.key=t.key
效率低下,但 ANSI SQL 标准方法是:
UPDATE target
SET col1 = (SELECT s.col1
FROM source s
WHERE s.key = target.key),
col2 = (SELECT s.col2
FROM source s
WHERE s.key = target.key);
这并不意味着它适用于每个 RDBMS(例如,我认为它不适用于 Access),但它确实适用于您列出的 4 个 RDBMS。
我个人会在一周的每一天都重视性能而不是可移植性,所以我不会使用这种语法。我倾向于使用存储过程,具有通用名称,但每个 RDBMS 的语法不同。
更新
实际上,ANSI SQL 标准也允许使用行值构造函数为 Oracle 展示的方法:
UPDATE target
SET (t.col1, t.col2) = (SELECT s.col1, s.col2
FROM source s
WHERE s.key = t.key);
不幸的是,如上所述,仅仅因为它符合 ANSI 标准并不意味着它可以跨平台工作。
ANSI 更新语法(它应该适用于您列出的 DBMS):
update t1
set col1 = (
select col1
from t2
where t1.key = t2.key
),
set col2 = (
select col2
from t2
where t1.key = t2.key
)
我想根据另一个 table (source
) 中存在的值更新 table (target
)。但我正在寻找一种适用于 4 个主要数据库的语法 - Oracle、MS SQL Server、PostgreSQL、MySQL.
到目前为止,我还没有找到这样一个统一的语法。是我错过了这样的语法还是真的没有这样的语法?
甲骨文
UPDATE target t
SET (t.col1, t.col2) = (SELECT s.col1, s.col2
FROM source s
WHERE s.key = t.key)
MS SQL 服务器/PostgreSQL
UPDATE target t
SET t.col1 = s.col1, t.col2 = s.col2
FROM source s
WHERE t.key=s.key
MySQL
UPDATE target, source
SET t.col1=s.col1, t.col2=s.col2
WHERE s.key=t.key
效率低下,但 ANSI SQL 标准方法是:
UPDATE target
SET col1 = (SELECT s.col1
FROM source s
WHERE s.key = target.key),
col2 = (SELECT s.col2
FROM source s
WHERE s.key = target.key);
这并不意味着它适用于每个 RDBMS(例如,我认为它不适用于 Access),但它确实适用于您列出的 4 个 RDBMS。
我个人会在一周的每一天都重视性能而不是可移植性,所以我不会使用这种语法。我倾向于使用存储过程,具有通用名称,但每个 RDBMS 的语法不同。
更新
实际上,ANSI SQL 标准也允许使用行值构造函数为 Oracle 展示的方法:
UPDATE target
SET (t.col1, t.col2) = (SELECT s.col1, s.col2
FROM source s
WHERE s.key = t.key);
不幸的是,如上所述,仅仅因为它符合 ANSI 标准并不意味着它可以跨平台工作。
ANSI 更新语法(它应该适用于您列出的 DBMS):
update t1
set col1 = (
select col1
from t2
where t1.key = t2.key
),
set col2 = (
select col2
from t2
where t1.key = t2.key
)