【问题标题】:What kind of join is used in a Vertica UPDATE statement?Vertica UPDATE 语句中使用了哪种联接?
【发布时间】:2016-10-31 20:43:34
【问题描述】:

在基于连接值更新表时,Vertica 有一个有趣的更新语法。它不使用连接来查找更新行,而是要求使用如下语法:

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

(请注意,这种语法在这种情况下确实是强制性的,因为 Vertica 禁止我们使用包含“自连接”的 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 的内部连接?或者它是否被更新为零,就好像条件是左外连接一样?

【问题讨论】:

  • 查询中的b 是什么?

标签: sql join left-join vertica


【解决方案1】:

我认为 Vertica 使用 Postgres 标准来处理这种语法:

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

这是INNER JOIN。我同意,如果 Postgres 和派生数据库支持对更新表显式 JOINs 会很好(就像其他一些数据库一样)。但你的问题的答案是这是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;

【讨论】:

  • 这些解决方案是否与"no self-joins" rule 发生冲突?我猜第一个解决方案可以,但第二个不是?
  • 我知道我可以试试这个,看看 Vertica 允许什么,但我有过 Vertica 静默失败并在这种自联接更新查询上产生垃圾结果的糟糕经历。
  • @Paul 。 . .好吧,最后一个查询显然违反了这条规则。我不知道 Vertica 是否允许 UPDATEs 中的相关子查询。这个答案基于与 Postgres 的语法相似性,所有三个查询都应该在 Postgres 中工作。
  • 依赖默认值会不会更规范,这样即使没有匹配项也不需要更新?我正在从 MS Access SQL 迁移代码,可能其中的习语不能很好地迁移。
  • @Paul 。 . .如果您可以使用默认值,它可能会更简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多