在主要数据库中工作的UPDATE语法

时间:2015-09-07 11:16:43

标签: mysql sql sql-server oracle ansi

我想根据另一个表(target)中的值更新表(source)。但我正在寻找一种可在4个主要数据库中运行的语法 - Oracle,MS SQL Server,PostgreSQL,MySQL。

到目前为止,我无法找到这样统一的语法。我是否错过了这样的语法,或者确实没有这样的语法?

的Oracle

UPDATE target t
SET (t.col1, t.col2) = (SELECT s.col1, s.col2 
                       FROM source s 
                       WHERE s.key = t.key)

MS SQL Server / 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

2 个答案:

答案 0 :(得分:3)

效率低下,但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的语法不同。

<强>更新

实际上,ANSI SQL标准也允许使用行值构造函数为Oracle显示的方法:

UPDATE target
SET (t.col1, t.col2) = (SELECT s.col1, s.col2 
                       FROM source s 
                       WHERE s.key = t.key);

不幸的是,如上所述,仅仅因为它符合ANSI标准,并不意味着它可以跨平台工作。

答案 1 :(得分:2)

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
              )