目前要在Table3中更新数据,这取决于Tables1和Table2中的条件,我这样做:
Update Table_B as T1
Inner Join Table_A as T2
On T1.S_ID=T2.ID
Set T1.Percent = T2.Percent
Update Table_C as T1
Inner Join Table_B as T2
On T1.ID=T2.J_ID
Set T1.B = T2.B
Where T2.Percent=100
我不想使用TableA Percent存储或更新TableB,并以某种方式在单个语句中进行连接。
答案 0 :(得分:0)
update table_b T1 set T1.Percent=(select T2.Percent from table_a T2 where T1.S_ID=T2.ID)
update table_c T1 set T1.B=(select T2.B from table_b T2 where T1.ID=T2.J_ID) where exists(select * from table_b T3 where T1.ID=T3.J_ID and T3.percent=100)
答案 1 :(得分:0)
这在UPDATE语句
中不是有效的语法Set T1.Percent as T1.Percent
^^
这不是有效的
Set T1.B as T2.B
^^
问题中UPDATE语句中的语法看起来不合适。
SET赋值运算符是等号,而不是As
关键字。
并且T1.Percent = T1.Percent
没有多大意义,因为似乎没有必要将列设置为其当前值。
如果没有一些示例数据,并且达到了预期的最终结果,目前还不清楚你实际想要实现的是什么。
要编写多表UPDATE语句,我首先编写一个SELECT语句,它返回我要更新的表的主键(或唯一键),以及要更新的列的当前值,以及返回将分配给列的新值的表达式
基于问题中的SQL,看起来您可能需要两个连接,如下所示:
SELECT ...
FROM table_a a
JOIN table_b b
ON b.s_id = a.id
JOIN table_c c
ON c.id = b.j_id
WHERE a.percent = 100
ORDER BY ...
(我们对列和关系的基数一无所知,无论是一对一,一对多,零或一对一,等等。我们&# 39;重新猜测。)
要评估和测试查询,我要包含表的主键。我猜猜id
是(不幸名为)Table_A和Table_C的主键。并且猜测元组(j_id,s_id)
是Table_B
中的唯一键。
我还将包括要更新的列(以显示当前值),以及一个返回要分配给列的新值的表达式。
这样的事情:
SELECT a.id AS `a__id`
, a.percent AS `a__percent`
, b.j_id AS `b__j_id`
, b.s_id AS `b__s_id`
, c.id AS `c__id`
, c.b AS `c__b_old`
, b.b AS `c__b_new`
FROM table_a a
JOIN table_b b
ON b.s_id = a.id
JOIN table_c c
ON c.id = b.j_id
WHERE a.percent = 100
ORDER
BY c.id
, a.id
我会测试一下,并确保它返回我要更新的Table_C
行,并且c__b_new
表达式返回的值是我想要的值分配到b
中的Table_C
列。
一旦我使SELECT语句正常工作(并且在我使其正常工作后仅 ),我将其转换为多表更新。
只需将SELECT ... FROM
部分替换为关键字UPDATE
。
在WHERE
子句之前,添加一个SET
子句,用于将新值分配给列。 (我使用在SELECT列表中使用的相同表达式来返回新值。)
UPDATE table_a a
JOIN table_b b
ON b.s_id = a.id
JOIN table_c c
ON c.id = b.j_id
SET c.b = b.b
WHERE a.percent = 100
这只是我如何编写多表UPDATE的一个例子。 无保证该声明可以满足您的需求。同样,它还不清楚你想要实现的目标;规范太模糊了;所以我们只是在猜测。