2015-05-26 5 views
0

Мне нужно преобразовать следующую команду SQL в SQL Update следующим образом:Make SQL Update из SQL Select

SELECT P.Partno, SUM(D.Qty_ordered) - SUM(Qty_rec) as QTY_ONORDER 
    FROM Parts P 
    LEFT JOIN PoDet D ON P.Partno = D.Partno 
    LEFT JOIN PoRec R ON D.PoDet_pk = R.PoDet_pk 
    GROUP BY P.Partno 

мне нужно обновить столбец ONORDER из таблицы частей, установив значение SUM (D. QTY_Ordered) - SUM (QTY_REC). То есть, установите значение в текущее количество на заказ.

Я попробовал следующее (но я получаю сообщение об ошибке):

UPDATE P P.ONORDER = SUM(D.Qty_ordered) - SUM(Qty_rec) 
    FROM Parts P 
    LEFT JOIN PoDet D ON P.Partno = D.Partno 
    LEFT JOIN PoRec R ON D.PoDet_pk = R.PoDet_pk 
    GROUP BY P.Partno 

Что мне нужно изменить?

+0

Можете ли вы отправить сообщение об ошибке. –

+0

Ошибка: Неверный синтаксис рядом с ключевым словом 'GROUP'. – Hidalgo

+0

Ваше обновление отсутствует «SET» –

ответ

1

Вы отсутствуют SET ключевое слово в update заявлении также то не правильный синтаксис

Попробуйте этот синтаксис

UPDATE up 
SET up.ONORDER = QTY_ONORDER 
FROM Parts up 
     INNER JOIN (SELECT P.Partno, 
          Sum(D.Qty_ordered) - Sum(Qty_rec) AS QTY_ONORDER 
        FROM Parts P 
          LEFT JOIN PoDet D 
           ON P.Partno = D.Partno 
          LEFT JOIN PoRec R 
           ON D.PoDet_pk = R.PoDet_pk 
        GROUP BY P.Partno) A 
       ON up.Partno = A.Partno 
+0

Спасибо. Ваш код работает. – Hidalgo

0

неочищенное (но читаемый) способ сделать это было бы что-то вроде этого:

UPDATE Parts set ONORDER = (select SUM(D.Qty_ordered) - SUM(Qty_rec) 
    FROM PoDet D 
    LEFT JOIN PoRec R ON D.PoDet_pk = R.PoDet_pk 
    where D.Partno = Parts.Partno) 
0

я держал пари, что это то, что вы имеете в виду

UPDATE P 
    set P.ONORDER = SUM(D.Qty_ordered - R.Qty_rec) 
    FROM Parts P 
    LEFT JOIN PoDet D ON P.Partno = D.Partno 
    LEFT JOIN PoRec R ON D.PoDet_pk = R.PoDet_pk 
    GROUP BY P.Partno 
+0

Спасибо. Да, я пропустил SET в моем примере выше. – Hidalgo

2

Вам нужно выполнить агрегацию в подзапросе. Я предполагаю, что величины поступают из двух таблиц: join. Если это так, ваша версия будет производить декартово произведение - и если в данной таблице больше одной строки для данной части, номера будут отключены.

Я думаю, что это то, что вы хотите:

UPDATE P 
    SET P.ONORDER = COALESCE(d.qty, 0) - COALESCE(r.qty, 0)) 
    FROM Parts P LEFT JOIN 
     (SELECT D.PartNo, SUM(D.Qty_ordered) as qty 
     FROM PoDet D 
     GROUP BY d.PartNo 
     ) D 
     ON P.Partno = D.Partno LEFT JOIN 
     (SELECT D.PartNo, SUM(R.Qty_rec) as qty 
     FROM PoDet D JOIN 
       PoRec R 
       ON D.PoDet_pk = R.PoDet_pk 
     GROUP BY D.PartNo 
     ) R 
     ON P.PartNo = R.PartNo; 
+0

Во-первых, спасибо. Что меня смущает в вашем коде, так это то, что PoRec не имеет колонки PartNo. Он имеет столбец PoDet_PK, внешний ключ к таблице PODET. – Hidalgo

+0

@Hidalgo. , , Я вижу это сейчас. Я обновил запрос. Эта форма необходима, если вы можете иметь несколько совпадений в 'PoDet' для одной части. –

+0

Гордон, извините еще раз. Но последняя часть вашего кода «ON P.PoDet_pk = R.PartNo» неверна. В таблице P (Parts) отсутствует столбец PoDet_PK. – Hidalgo

1

ничего плохого с ответом Fireblade, я просто думал, что будет способствовать альтернативный подход - проще для начинающих (и мне) следовать

-- create the results 
SELECT P.Partno, SUM(D.Qty_ordered) - SUM(Qty_rec) as QTY_ONORDER 
INTO #tmp 
    FROM Parts P 
    LEFT JOIN PoDet D ON P.Partno = D.Partno 
    LEFT JOIN PoRec R ON D.PoDet_pk = R.PoDet_pk 
    GROUP BY P.Partno 

-- apply 
UPDATE P 
SET ONORDER=#tmp.QTY_ONORDER 
FROM P 
JOIN #tmp ON P.PartNo=#tmp.Partno 

-- clean 
DROP TABLE #tmp 
+0

Роб, спасибо, что помогли мне понять ответ Fireblade. – Hidalgo

0

Просто используя ваши запросы:

UPDATE P set P.ONORDER = temp.QTY_ONORDER 
from 
( 
SELECT P.Partno as part, SUM(D.Qty_ordered) - SUM(Qty_rec) as QTY_ONORDER 
FROM Parts P 
LEFT JOIN PoDet D ON P.Partno = D.Partno 
LEFT JOIN PoRec R ON D.PoDet_pk = R.PoDet_pk 
GROUP BY P.Partno 
) temp 
where temp.part = P.Partno ;