在三个表之间加入/更新

时间:2016-06-03 23:56:24

标签: mysql join

目前要在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,并以某种方式在单个语句中进行连接。

2 个答案:

答案 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的一个例子。 无保证该声明可以满足您的需求。同样,它还不清楚你想要实现的目标;规范太模糊了;所以我们只是在猜测。