2012-04-26 4 views
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 

К сожалению, я не знаю, как получить мои ценности без ссылок на целевую таблицу «с»! Есть ли обходной путь для этого?

ответ

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.

+0

Я не уверен, что сервер SQL, но подзапрос, чтобы обновить поле должен возвращать одну строку и один столбец. – newtover

+0

по-прежнему получают ту же ошибку. "# 1093 - Вы не можете указывать целевую таблицу 'aallinnot2' для обновления в разделе FROM" – Nat

+0

Хороший спот newtover. Я отредактировал соответственно. Nathaniel - думаю, что я не в своей глубине. Я уверен, что SQL Server будет работать с этим. –

1

С сумасшедшими именами таблиц и столбцов и неразборчивой логикой это может быть самый уродливый запрос, который я когда-либо видел. Congrats. :)

Я думаю, что следующее должно работать (или этот подход). Основная проблема заключалась в распутывании выражения 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' 
    ); 
+0

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'FROM (SELECT d.id1, ​​SUM (c.Energ_Kcal) AS Sum_Energ_Kcal FROM aaingred a' в строке 1 – Nat

+0

Взял еще одну трещину ... Я думаю, что это правильный синтаксис. – McGarnagle

Смежные вопросы