【问题标题】:Update statement with nested joins not working带有嵌套连接的更新语句不起作用
【发布时间】:2012-05-07 12:19:20
【问题描述】:

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

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”,我不知道如何获取我的值!有解决办法吗?

【问题讨论】:

    标签: mysql join subquery


    【解决方案1】:

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

    我认为以下应该有效(或这种方法)。主要问题是解开 group-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'
        );
    

    【讨论】:

    • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“FROM (SELECT d.id1,​​ SUM(c.Energ_Kcal) AS Sum_Energ_Kcal FROM aaingred a”附近使用正确的语法
    • 又试了一次……我认为现在的语法是正确的。
    【解决方案2】:

    我不确定 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 子句中。

    【讨论】:

    • 我不确定 SQL server,但是更新字段的子查询应该返回一行一列。
    • 仍然得到同样的错误。 "#1093 - 您不能在 FROM 子句中指定目标表 'aallinnot2' 进行更新"
    • 好地方newtover。我已经进行了相应的编辑。 Nathaniel - 认为我在这里超出了我的深度 - 我很确定 SQL Server 可以使用它。
    • 看看这个问题的答案:stackoverflow.com/questions/8333376/…
    • 感谢 lordsauce,我将学习递归查询。关于@newtover 评论,我正在尝试更新 Energ_Kcal 列中的多行,其中 NDB_No 等于 IN 语句中子查询的结果。我应该如何在子查询中返回多个不同的行?
    猜你喜欢
    • 2023-03-11
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多