在Vertica UPDATE语句中使用什么类型的连接?

时间:2016-10-31 20:43:34

标签: sql join left-join vertica

在根据连接值更新表时,Vertica具有一种有趣的更新语法。它不是使用连接来查找更新行,而是强制使用如下语法:

UPDATE a
SET col = b.val
where a.id = b.id

(请注意,在这种情况下确实需要这种语法,因为Vertica禁止我们使用包含" self-join"的where子句,这是一个引用正在更新的表的连接,在此案例a。)

这种语法很好,但与其他SQL方言相比,它使用的连接不太明确。例如,在这种情况下会发生什么?

UPDATE a
SET col = CASE 0 if b.id IS NULL ELSE b.val END
where a.id = b.id

a.idb.id不匹配时会发生什么? a.col是否会更新,a.id = b.id代表ab的内部联接?或者它是否更新为零,就像条件是左外连接一样?

1 个答案:

答案 0 :(得分:6)

我认为Vertica使用Postgres标准来实现这种语法:

UPDATE a
    SET col = b.val
    FROM b
    whERE a.id = b.id;

这是INNER JOIN。我同意如果Postgres和派生数据库支持显式JOIN到更新表(就像其他一些数据库那样)会很好。但问题的答案是INNER JOIN

我应该注意,如果你想要一个LEFT JOIN,你有两个选择。一个是相关的子查询:

UPDATE a
    SET col = (SELECT b.val FROM b whERE a.id = b.id);

另一个是JOIN的额外级别(假设ida是唯一的):

UPDATE a
    SET col = b.val
    FROM a a2 LEFT JOIN
         b
         ON a2.id = b.id
    WHERE a.id = a2.id;