在根据连接值更新表时,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.id
中b.id
不匹配时会发生什么? a.col
是否会更新,a.id = b.id
代表a
和b
的内部联接?或者它是否更新为零,就像条件是左外连接一样?
答案 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
的额外级别(假设id
中a
是唯一的):
UPDATE a
SET col = b.val
FROM a a2 LEFT JOIN
b
ON a2.id = b.id
WHERE a.id = a2.id;