Vertica UPDATE 语句中使用了哪种连接?
What kind of join is used in a Vertica UPDATE statement?
Vertica 在根据连接值更新 table 时有一个有趣的更新语法。它不是使用连接来查找更新行,而是强制使用如下语法:
UPDATE a
SET col = b.val
where a.id = b.id
(请注意,这种语法在这种情况下确实是强制性的,因为 Vertica 禁止我们使用包含 "self-join" 的 where 子句,这是一个引用正在更新的 table 的连接,在这种情况 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
的内部联接一样?或者它会更新为零,就好像条件是左外连接一样?
我认为 Vertica 使用此语法的 Postgres 标准:
UPDATE a
SET col = b.val
FROM b
whERE a.id = b.id;
这是一个INNER JOIN
。我同意,如果 Postgres 和派生数据库支持对更新 table 的显式 JOIN
s(就像其他一些数据库所做的那样),那将会很好。但是你的问题的答案是,这是一个 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;
Vertica 在根据连接值更新 table 时有一个有趣的更新语法。它不是使用连接来查找更新行,而是强制使用如下语法:
UPDATE a
SET col = b.val
where a.id = b.id
(请注意,这种语法在这种情况下确实是强制性的,因为 Vertica 禁止我们使用包含 "self-join" 的 where 子句,这是一个引用正在更新的 table 的连接,在这种情况 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
的内部联接一样?或者它会更新为零,就好像条件是左外连接一样?
我认为 Vertica 使用此语法的 Postgres 标准:
UPDATE a
SET col = b.val
FROM b
whERE a.id = b.id;
这是一个INNER JOIN
。我同意,如果 Postgres 和派生数据库支持对更新 table 的显式 JOIN
s(就像其他一些数据库所做的那样),那将会很好。但是你的问题的答案是,这是一个 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;