1

別のテーブルのいくつかの値の合計に基づいて、テーブル内の複数のレコードを更新する必要があります。これが私の質問です:

UPDATE aallinnot2 c SET c.Energ_Kcal = ( SELECT d.id1, SUM( c.Energ_Kcal) 
FROM aaingred a
LEFT JOIN aaweight b ON a.unit = b.uni
LEFT JOIN aallinnot2 c ON a.mfdfsds = c.NDB_No
LEFT JOIN aalinfsds d ON a.fsdsnum = d.id1
WHERE d.own_id =42
GROUP BY id1 ) 
WHERE c.NDB_No
IN (    SELECT DISTINCT  `fsdsnum` 
FROM  `aaingred` 
WHERE  `usernum` LIKE  '42'
)

MySQL said: 

#1093 - You can't specify target table 'c' for update in FROM clause 

残念ながら、ターゲットテーブル'c'を参照せずに値を取得する方法がわかりません。これに対する回避策はありますか?

4

2 に答える 2

1

クレイジーなテーブル/カラム名と解読不能なロジックにより、これは私が今まで見た中で最も醜いクエリかもしれません. おめでとうございます。:)

次の方法(またはこのアプローチ)が機能すると思います。主な問題は、group-by 式のもつれを解くことでした。データベース エンジンに、ターゲット テーブルの各行が、その行の更新された値を含むセットに結合されるデータセットを与える必要があります。ここでは、サブクエリで新しい値を選択し、そのサブクエリを元のテーブルに結合します。

EDITいくつかの構文を修正しました

    UPDATE 
    (
    SELECT d.id1, SUM (c.Energ_Kcal) AS Sum_Energ_Kcal
        FROM aaingred a
            LEFT JOIN aaweight b ON a.unit = b.uni
            LEFT JOIN aallinnot2 c ON a.mfdfsds = c.NDB_No
            LEFT JOIN aalinfsds d ON a.fsdsnum = d.id1
        WHERE d.own_id =42
        GROUP BY id1
    ) d
    ,aaingred a, aallinnot2 d
    SET Energ_Kcal = d.Sum_Energ_Kcal
    WHERE d.id1 = a.fsdsnum
    AND a.mfdfsds = aallinnot2.NDB_No
    AND c.NDB_No IN (
        SELECT DISTINCT  `fsdsnum` 
        FROM  `aaingred` 
        WHERE  `usernum` LIKE  '42'
    );
于 2012-04-26T20:12:33.860 に答える
0

mysql についてはよくわかりませんが、SQL Server の場合、ステートメントは次のようになります。

    UPDATE aallinnot2 
    SET Energ_Kcal = ( 
    SELECT SUM( c.Energ_Kcal) 
    FROM aaingred a
    LEFT JOIN aaweight b ON a.unit = b.uni
    LEFT JOIN aallinnot2 c ON a.mfdfsds = c.NDB_No
    LEFT JOIN aalinfsds d ON a.fsdsnum = d.id1
    WHERE d.own_id =42) 
    WHERE c.NDB_No
    IN (    SELECT DISTINCT  `fsdsnum` 
    FROM  `aaingred` 
    WHERE  `usernum` LIKE  '42')

UPDATE句で更新するテーブルを別名にすることはできませんが、句ではできますFROM

于 2012-04-26T18:12:06.390 に答える