【问题标题】:Updating individual table from two joined tables (SQL)从两个连接表更新单个表 (SQL)
【发布时间】:2015-01-27 08:55:12
【问题描述】:

我的一个朋友刚刚问了我这个问题,我不确定答案。

是否可以更新使用 JOIN 添加到另一个表的单个表?

例如,我们有P.table_aP.table_btable_atable_b 已“加入”。我可以从返回(加入)的结果中更新table_a,并让原始table_a 反映此更改吗?或者连接是否会复制表,以便任何编辑只影响 JOIN 的结果?我倾向于第一个选项,但我不是 100% 确定。

【问题讨论】:

  • 这高度依赖于 DBMS。你用的是哪一个?后格雷斯?甲骨文?
  • 我相信他们使用 MySQL(我认为那是一个 DBMS...)

标签: mysql sql join sql-update


【解决方案1】:

你的问题有点不清楚。但一般的答案是“是”。以下是一些机制:

  • 许多数据库直接以update 语法支持join。在这种情况下,您只需将update 与显式join 一起编写即可。

  • 许多数据库都支持merge 语句。在这种情况下,merge 的行为很像update 并允许joins。

  • 许多数据库都支持视图触发器。在这种情况下,您可以在视图上编写更新触发器。当它被执行时,触发器可以更新视图。

  • 一些数据库支持物化视图。这些是视图(可以有连接的表)。当底层数据发生变化时,物化视图也会发生变化。

我可能遗漏了其他方法。毫无疑问,您使用的任何数据库都至少支持其中一种。

编辑:

再一次,我不明白你的意思。我能想到的“虚拟表”的唯一正式用途是 SQLite 中引用外部数据源的特定机制。

也许你真正想要的只是一个视图。这是标准的,基本上在所有数据库中都可用。视图定义中可以有连接。执行视图时,结果来自基础表的最新版本。不涉及“更新”;定义视图的查询在执行引用它的查询时(以某种方式)执行。

【讨论】:

  • 考虑到我的问题有多模糊,这是一个很好的答案。我意识到这很不清楚,我正试图弄清楚如何让它更清楚。假设虚拟 table_c 是 table_a 与 table_b 连接的。如果我编辑 table_c,更改会反映在 table_a 和/或 table_b 中吗?我正在阅读您的答案,但我对某些术语仍然有些不确定(SQL 对我来说仍然很新)。可能是我也使用了错误的术语。我不能完全确定您是否回答了我实际上正在考虑的问题。不知道我表达是否正确。这有意义吗?
  • 我的意思是“虚拟表”,意思是结果表。并不是要向您抛出错误的术语。事实证明,他实际上是在 Java 中构建这些查询,这是我不知道的。我认为这是不够清晰的原因——我不太明白他在问什么,因为他在最初的问题中忽略了这个问题。对于造成的混乱,我深表歉意——我仍然对此表示 +1,因为这是一个非常有用的答案!
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2015-03-03
  • 2020-04-04
  • 2019-08-07
相关资源
最近更新 更多