2011-04-12 2 views
2
SELECT quotes.qid, SUM(qitems.net_cost_ext) 
FROM quotes, qitems 
WHERE quotes.qid = qitems.qid 
GROUP BY qitems.qid; 

UPDATE quotes, qitems 
SET quotes.net_cost_total = SUM(qitems.net_cost_ext) 
WHERE quotes.qid = qitems.qid 
GROUP BY qitems.qid; 

Вышеуказанные операторы select суммируют чистую стоимость всех продуктов по каждой котировке и отображает сумму по номеру предложения.Как преобразовать оператор select в инструкцию обновления?

Я добавил поле таблицы net_cost_total в таблицу кавычек. Я хочу обновить все цитаты с итогами net_cost из каждой цитаты. Запрос терпит неудачу, он говорит, что синтаксис GROUP плох, я не уверен, как это сделать.

ответ

5

Попробуйте это:

UPDATE quotes AS q 
     JOIN (SELECT quotes.qid, 
         SUM(qitems.net_cost_ext) AS SUM 
        FROM quotes, 
         qitems 
        WHERE quotes.qid = qitems.qid 
        GROUP BY qitems.qid) AS d 
     ON d.qid = q.qid 
SET q.net_cost_total = d.SUM 
+0

Это решение работает Великий. Я не знал, что это может сделать объединение ... Я всегда использовал их для простого объединения таблиц. Если я правильно понимаю, что вы создаете пользовательскую версию таблицы qitems, основанную на инструкции select в операторе объединения ... – payling

+0

Это называется производной таблицей из select. Это() фактически включает виртуальную таблицу. – Pentium10

1

Try:

UPDATE quotes 
INNER JOIN (
    SELECT SUM(qitems.net_cost_ext) AS s 
    FROM qitems 
    GROUP BY qitems.qid 
) q USING(qid) 
SET net_cost_total = q.s 

(вдохновленный от последнего MySQL комментарий here)

0

с использованием стандартных SQL:

UPDATE quotes 
    SET net_cost_total = (
         SELECT SUM(net_cost_ext) 
          FROM qitems 
          WHERE quotes.qid = qitems.qid 
         ) 
WHERE EXISTS (
       SELECT * 
       FROM qitems 
       WHERE quotes.qid = qitems.qid 
      ); 
Смежные вопросы