嵌套连接的更新语句不起作用

时间:2012-04-26 18:08:21

标签: mysql join subquery

我需要根据另一个表中某些值的总和更新表中的多个记录。这是我的疑问:

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'的情况下获取我的值!有解决方法吗?

2 个答案:

答案 0 :(得分:1)

使用疯狂的表/列名称和难以理解的逻辑,这可能是我见过的最丑陋的查询。恭喜。 :)

我认为以下内容应该有效(或者这种方法)。主要问题是解开gr​​oup-by表达式 - 您需要为数据库引擎提供一个数据集,其中目标表中的每一行都连接到一个包含该行更新值的集合。所以在这里,在子查询中选择新值,然后将该子查询连接到原始表。

编辑修正了一些语法

    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'
    );

答案 1 :(得分: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子句中。