使用join子句更新2表

时间:2012-12-18 09:42:36

标签: mysql

我尝试使用join子句更新2个表中的某些字段。 但是每次测试都很糟糕,mysql返回错误。

我的查询是:

    UPDATE `Table1` t1 , `Table2` t2
LEFT OUTER JOIN `Table2` t3 ON t1.acIndex = t3.ecActe
SET t2.ecDate=DATE_SUB(t2.ecDate, INTERVAL 183 DAY), t1.acDateF=DATE_SUB(t1.acDateF, INTERVAL 183 DAY), t1.acDateDebut=DATE_SUB(t1.acDateDebut, INTERVAL 183 DAY) 
WHERE (t1.acTraitement='5861' AND t1.acDateDebut>'2012-12-07' )

那么你能帮我找到为什么查询不好吗? 感谢

2 个答案:

答案 0 :(得分:0)

正如JOIN Syntax所述:

  

加入MySQL 5.0.12中的处理更改

     

[ deletia ]

     
      
  • 以前,逗号运算符(,)和JOIN都具有相同的优先级,因此连接表达式t1, t2 JOIN t3被解释为((t1, t2) JOIN t3)。现在JOIN具有更高的优先级,因此表达式被解释为(t1, (t2 JOIN t3))。此更改会影响使用ON子句的语句,因为该子句只能引用连接操作数中的列,并且优先级的更改会更改这些操作数的解释。

         

    示例:

    CREATE TABLE t1 (i1 INT, j1 INT);
    CREATE TABLE t2 (i2 INT, j2 INT);
    CREATE TABLE t3 (i3 INT, j3 INT);
    INSERT INTO t1 VALUES(1,1);
    INSERT INTO t2 VALUES(1,1);
    INSERT INTO t3 VALUES(1,1);
    SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);
         

    以前,SELECT是合法的,因为t1,t2隐式分组为(t1,t2)。现在JOIN优先,因此ON子句的操作数为t2t3。由于t1.i1不是任一操作数中的列,因此结果为Unknown column 't1.i1' in 'on clause'错误。要允许处理连接,请使用括号将前两个表显式分组,以便ON子句的操作数为(t1,t2)t3

    SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
         

    或者,避免使用逗号运算符并改为使用JOIN

    SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);
         

    此更改也适用于将逗号运算符与INNER JOINCROSS JOINLEFT JOINRIGHT JOIN混合在一起的语句,所有这些语句现在都具有比逗号更高的优先级操作

  •   

答案 1 :(得分:0)

语法不正确。试试这个查询 -

UPDATE
  `Table1` t1
LEFT OUTER JOIN `Table2` t2
  ON t1.acIndex = t2.ecActe
SET
  t2.ecDate = DATE_SUB(t2.ecDate, INTERVAL 183 DAY),
  t1.acDateF = DATE_SUB(t1.acDateF, INTERVAL 183 DAY),
  t1.acDateDebut = DATE_SUB(t1.acDateDebut, INTERVAL 183 DAY)
WHERE
  (t1.acTraitement = '5861' AND t1.acDateDebut > '2012-12-07')