【问题标题】:Update columns in multiple tables with inner join使用内部联接更新多个表中的列
【发布时间】:2013-04-30 22:12:43
【问题描述】:

编辑原来有一个 H2 数据库位于 mysql 数据库之上。我写的查询改为命中 H2。我会继续研究看看这是否可行

我有两个要同时更新的表,其中一个的值由存储在另一个中的值确定。我的更新查询如下所示:

UPDATE table1 AS A INNER JOIN table2 AS B
ON A.COL1 = B.COL1
AND A.COL2 = B.COL2
SET A.COL3 = 'SOME VAL',
B.COL4 = B.COL4 - A.COL4,
B.COL5 = B.COL5 - A.COL4
WHERE A.ID IN (23,5,21)

我在执行 INNER JOIN 时收到一个语法错误,上面写着“预期的“SET””。

我相信我应该能够按照UPDATE multiple tables in MySQL using LEFT JOINhttp://dev.mysql.com/doc/refman/5.0/en/update.html 执行此加入更新。有人知道我的语法错误是什么吗?

为后代更新
首先,感谢 Thomas Mueller 的帮助。

我最终使用了以下语法,因为我发现它有些混乱,所以我将它留在这里供以后的观众使用。

UPDATE TABLE1 SET(COL1, COL2) = 
( SELECT T1.COL1 - T2.AMNT, T1.COL2 + T2.AMNT
  FROM TABLE1 T1 RIGHT JOIN TABLE2 T2
  ON T1.COL3 = T2.COL3
  AND T1.COL4 = T2.COL4
  WHERE T2.ID = 23)
WHERE EXISTS 
(  SELECT * 
   FROM TABLE2
   WHERE TABLE1.COL3 = TABLE2.COL3
   AND TABLE1.COL4 = TABLE2.COL4
   AND TABLE2.ID = 23)

注意:我必须在第一个选择中使用连接,因为我无法让我们在下面讨论的语法起作用。

由于使用此方法,如果我得到一个 table2 id 列表(在我的原始示例中为 23、5、21),我必须执行多个更新语句。如果有人知道更好的方法,请告诉我。

【问题讨论】:

  • 你的查询本身没有问题,检查表或列名,也许有些是限制词,如果它是存储过程的一部分或任何其他类型的代码,请尝试反引号块检查前面的语句是否以分号等正确结束...
  • 也许您使用的是非常旧的版本,例如 4.1?如果您不知道,请运行 SELECT VERSION()
  • 原来我使用的是 mysql 5.5 但上面有一个 H2 数据库。所以我得到了语法错误,因为我实际上是在查询 H2 表。将更新问题以反映这一点,但我不太乐观地认为这现在会起作用。

标签: mysql sql-update h2


【解决方案1】:

H2 不支持在一个 SQL 语句中同时更新两个表。您将需要使用两个语句。有关支持的语法,请参阅UPDATE statement railroad diagram

【讨论】:

  • 我至少可以执行以下操作吗?我无法正确格式化。但是我正在尝试使用 table2 中的值更新 Table1 上的两个列值,其中 table2 上的某些条件 UPDATE SUP_INV SI set (SI.Amnt_Reserved, SI.Amnt_Used) = (Select SI.Amnt_Reserved - JS.Amnt, SI.Amnt_Used + JS.Amnt FROM JOB_SUPPLY JS WHERE SI.SUPPLY_NAME = JS.SUPPLY_NAME AND SI.SUPPLY_MFR = JS.SUPPLY_MFR AND JS.ENTITY_ID IN (23,15,49))
  • 我从您在groups.google.com/forum/?fromgroups=#!topic/h2-database/…987654322@的帖子中获得了语法
  • 是的,应该可以(好吧,我没有测试,但看起来不错)。您可能需要在update 语句中添加where 条件,可能是where exists(select ...),除非该表的所有行都需要更新。不幸的是,这可能意味着声明中有一些重复。
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 2014-01-21
  • 2022-11-03
  • 2020-06-16
  • 1970-01-01
  • 2017-03-24
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多