2013-04-30 66 views
3

编辑原来有一个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) 

我得到一个语法错误,说'期望“SET”'我正在做INNER JOIN。

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

更新为后人
首先感谢托马斯·穆勒对他的帮助。

我结束了使用下面的语法和我发现它有点混乱,我在这里留下以备将来观众。

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) 

注:我不得不使用的第一选择一个加入,因为我无法得到我们下面讨论工作的语法。

由于使用这种方法,如果我得到表2的id(在我原来的例子23,5,21)列表,我所要做的多个更新语句的结果。如果有人知道更好的方法来做到这一点,请让我知道。

+0

没有什么错在自己的查询,检查表或列名,也许一些被限制的话,尽量BACKTICK他们,如果存储过程或任何其他类型的代码块检查,如果前一个语句的一部分以分号等方式正确结束...... – piotrm 2013-04-30 22:28:46

+1

也许你正在使用一个非常旧的版本,如4.1?如果你不知道,运行SELECT VERSION() – 2013-04-30 22:42:49

+1

原来我使用的是mysql 5.5但是有一个H2数据库位于它的顶部。所以我得到的语法错误,因为我实际上查询H2表。将更新问题来反映这一点,但我不那么乐观,现在这将工作。 – 2013-05-01 13:46:45

回答

2

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

+0

我可以至少做下面的事情吗?我无法正确格式化。但我试图更新Table1上的两个列值与来自table2的值,其中table2上的一些条件 UPDATE SUP_INV SI set(SI.Amnt_Reserved,SI.Amnt_Used)= \t(Select SI.Amnt_Reserved - JS.Amnt, SI.Amnt_Used + JS.Amnt \t FROM JOB_SUPPLY JS \t WHERE SI.SUPPLY_NAME = JS.SUPPLY_NAME \t AND SI.SUPPLY_MFR = JS.SUPPLY_MFR \t AND JS.ENTITY_ID IN(23,15,49) \t) – 2013-05-01 16:44:04

+0

我从你的帖子中获得了这个语法https://groups.google.com/forum/?fromgroups=#!topic/h2-database/45DPbNVYxck – 2013-05-01 16:49:17

+0

是的,应该工作(以及我没有测试,但它l ooks好)。除非需要更新此表的所有行,否则可能需要在'update'语句中添加'where'条件,可能'where exists exists(select ...)'。不幸的是,这可能意味着声明中有一些重复。 – 2013-05-01 17:46:29