0

我尝试使用 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' )

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

4

2 回答 2

0

JOIN语法中所述:

在 MySQL 5.0.12 中加入处理更改

[ deletia ]

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

    例子:

    创建表 t1 (i1 INT, j1 INT);
    创建表 t2 (i2 INT, j2 INT);
    创建表 t3 (i3 INT, j3 INT);
    插入 t1 值(1,1);
    插入 t2 值(1,1);
    插入 t3 值(1,1);
    SELECT * FROM t1, t2 加入 t3 ON (t1.i1 = t3.i3);

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

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

    或者,避免使用逗号运算符,JOIN而是使用:

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

    此更改也适用于将逗号运算符与INNER JOIN, CROSS JOIN,LEFT JOIN和混合的语句RIGHT JOIN,所有这些语句现在都比逗号运算符具有更高的优先级。

于 2012-12-18T09:46:17.953 回答
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')
于 2012-12-18T09:47:56.940 回答