适用于主要数据库的更新语法

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
              )