Pau*_*aul 3 sql join left-join vertica
根据联接值更新表时,Vertica具有有趣的更新语法。它不是使用联接来查找更新行,而是强制使用如下语法:
UPDATE a
SET col = b.val
where a.id = b.id
Run Code Online (Sandbox Code Playgroud)
(请注意,在这种情况下确实要强制使用此语法,因为在这种情况下,Vertica禁止我们使用包含“自我联接”的where子句,该子句是引用要更新的表的联接a。)
这种语法很好,但是与其他SQL方言相比,使用联接的方式不太明确。例如,在这种情况下会发生什么?
UPDATE a
SET col = CASE 0 if b.id IS NULL ELSE b.val END
where a.id = b.id
Run Code Online (Sandbox Code Playgroud)
a.id没有比赛时会发生什么b.id?难道a.col没有更新,就好像条件a.id = b.id所代表的内连接a和b?还是将其更新为零,就像条件是左外部联接一样?
我认为Vertica为此语法使用Postgres标准:
UPDATE a
SET col = b.val
FROM b
whERE a.id = b.id;
Run Code Online (Sandbox Code Playgroud)
这是一个INNER JOIN。我同意,如果Postgres和派生数据库支持显式JOINs对更新表(就像其他一些数据库一样),那将是很好的。但这是您的问题的答案INNER JOIN。
我应该注意,如果您想要a LEFT JOIN,则有两个选择。一个是相关的子查询:
UPDATE a
SET col = (SELECT b.val FROM b whERE a.id = b.id);
Run Code Online (Sandbox Code Playgroud)
The other is an additional level of JOIN (assuming that id is unique in a):
UPDATE a
SET col = b.val
FROM a a2 LEFT JOIN
b
ON a2.id = b.id
WHERE a.id = a2.id;
Run Code Online (Sandbox Code Playgroud)