2016-11-08 3 views
1

Мне нужна помощь.SQL Множественная запись обновления от SELECT WHERE

Я хочу полностью количество материала с тем же идентификатором в любом счете.

как этот

bill no. 001 
jellopy x1ea 
jellopy x1ea 
jellopy x1ea 
zargon x1ea 

результат должен быть

bill no. 001 
jellopy x3ea 
zargon x1ea 

Итак, я хочу сделать что-то вроде этого

1.Select + сумма 2.update 3.delete дублируют

вот мой старый (dbill) стол

dbill

id mat qty 
01 A1 1 
01 A1 1 
01 A1 1 
01 A2 1 

id mat qty 
[01 A1 1] < same mat&id = SUM it 
[01 A1 1] < same mat&id = SUM it 
[01 A1 1] < same mat&id = SUM it 
01 A2 1 

и это SQLFiddle для испытания http://sqlfiddle.com/#!15/b30a3c количество

1 СУММА с тем же самым материалом

SELECT mat,id,sum(qty) result 
FROM dbill 
GROUP BY id,mat 

[2] получили результат, как этот

id mat qty 
01 A1 3 
01 A2 1 

[3] так ... я буду обновлять, как этот

UPDATE dbill 
SET qty = result 
FROM dbill t 
INNER JOIN 
(SELECT mat,id,sum(qty) result 
FROM dbill 
GROUP BY id,mat) s 
ON s.id = t.id 
AND s.mat = t.mat 

проблема, когда я [3] ДОПОЛНЕНО вот результат

id mat qty 
01 A1 3 
01 A1 3 
01 A1 3 
01 A2 3 

потому, что правильный результат должен be

id mat qty 
01 A1 3 
01 A1 3 
01 A1 3 
01 A2 1  < 

Благодарим вас за понимание и ответ ...

+2

[цитата из руководства] (https://www.postgresql.org/docs/current/static/sql-update.html): «* Обратите внимание, что целевая таблица должна ** не ** появится в from_list * " –

ответ

1

Для меня ваш запрос, кажется, нормально, просто замените UPDATE dbill с UPDATE t

UPDATE t <---- 
SET qty = result 
FROM dbill t 
INNER JOIN 
(SELECT mat,id,sum(qty) result 
FROM dbill 
GROUP BY id,mat) s 
ON s.id = t.id 
AND s.mat = t.mat 
+0

IMHO это синтаксис Microsoft. – joop

+0

такой же результат для меня, я думал, во всяком случае, спасибо :) – Thawatchai

0

Это может быть менее элегантно, но должен работать

UPDATE dbill t 
    SET t.qty = (select sum(qty) from dbill t2 where t2.id=t.id and t2.mat=t.mat) 
0

Проблема решена !!!

Здесь, это мое решение. (я могу получить t3.id из своего приложения, поэтому я просто конкатютирую его).

UPDATE dbill t3 
SET qty = t2.result 
FROM (
SELECT matno,hbill_ids,sum(qty) result 
FROM dbill t1 
GROUP BY hbill_ids,matno) t2 
WHERE (t3.hbill_ids = t2.hbill_ids 
AND t3.matno = t2.matno) 
AND (t3.id = 372 
OR t3.id = 373 
OR t3.id = 374 
OR t3.id = 375); 
DELETE FROM dbill t3 
WHERE id IN (SELECT id 
FROM dbill y1 
WHERE EXISTS ( 
SELECT * 
FROM dbill y2 
WHERE y1.matno = y2.matno 
AND y1.qty = y2.qty 
AND y1.hbill_ids = y2.hbill_ids 
AND y1.id < y2.id 
AND (t3.id = 372 
OR t3.id = 373 
OR t3.id = 374 
OR t3.id = 375) 
));