0

結合句を使用して、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構文で説明されているように:

MySQL5.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);

    以前は、asSELECTの暗黙的なグループ化により、は合法でした。現在はが優先されるため、句のオペランドはとです。はどちらのオペランドの列でもないため、結果はエラーになります。結合を処理できるようにするには、最初の2つのテーブルを括弧で明示的にグループ化して、句のオペランドがと:になるようにします。t1,t2(t1,t2)JOINONt2t3t1.i1Unknown 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 JOINこの変更は、コンマ演算子を、、、、およびCROSS JOIN、と混合するステートメントにも適用されます。これらはすべて、コンマ演算子よりも優先順位が高くなっています。LEFT JOINRIGHT 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 に答える