使用内部联接更新多个表中的列
Posted
技术标签:
【中文标题】使用内部联接更新多个表中的列【英文标题】: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 JOIN 和http://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 表。将更新问题以反映这一点,但我不太乐观地认为这现在会起作用。 【参考方案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 ...)
,除非该表的所有行都需要更新。不幸的是,这可能意味着声明中有一些重复。以上是关于使用内部联接更新多个表中的列的主要内容,如果未能解决你的问题,请参考以下文章