2014-12-18 4 views
2

Я пытаюсь обновить цену моей продукции, используя другую таблицу, которая имеет материал продукта и количество этого материалаоператор обновления Oracle с использованием нескольких столбцов

мои таблицы Produkt (PRODUKTID INT, NAZOV VARCHAR (47), VYROBNA_CENA int) ТАБЛИЦА (MATERIALID int, CENA числовое); TABLE zlozenie (PRODUKTKID int, MATERIALID int, MNOZSTVO int);

, что я пытаюсь сделать, это положить сумму (ZLOZENIE.MNOZSTVO * MATERIAL.CENA) в колонку VYROBNA_CENA

у меня есть два выбирает, которые возвращаются тем же колонок, но я не уверен, как использовать обновление значения передачи от одного к другому

первый - расчетной цене продукции

select PRODUKT.NAZOV as NAZOV, sum(ZLOZENIE.MNOZSTVO*MATERIAL.CENA) as celkova 
from MATERIAL, PRODUKT, ZLOZENIE 
where ZLOZENIE.MATERIALID=MATERIAL.MATERIALID 
and  PRODUKT.PRODUKTID=ZLOZENIE.PRODUKTKID 
group by PRODUKT.NAZOV 
order by PRODUKT.NAZOV 

второй один столовое Produkt с пустой цене (читать больше), и я хотел бы поставить результаты из суммы в столбце Cena

select PRODUKT.NAZOV, PRODUKT.vyrobna_cena 
from PRODUKT 
order by PRODUKT.NAZOV 

SQL скрипку с таблицами и запросами http://sqlfiddle.com/#!2/e183f/2

благодаря

+0

вы имеете в виду, как это [http://stackoverflow.com/questions/14618703/update-query-using-subquery-in-sql-server](http://stackoverflow.com/questions/14618703/ update-query-using-subquery-in-sql-server) – benji

+1

@benji обратите внимание, что эта статья является оракулом, а ваша ссылка является SQL-сервером. Может быть более конкретный способ справиться с этим на платформе. Кроме того, ваша ссылка не показывает, как обрабатывать агрегацию. – paqogomez

+0

@paqogomez, но разве это не та же концепция? 'set table set column = subquery'? – benji

ответ

2
MERGE INTO produkt p 
    USING 
(
    SELECT ZLOZENIE.PRODUKTKID, SUM(ZLOZENIE.MNOZSTVO*MATERIAL.CENA) AS celkova 
    FROM MATERIAL, ZLOZENIE 
    WHERE ZLOZENIE.MATERIALID=MATERIAL.MATERIALID 
    GROUP BY ZLOZENIE.PRODUKTKID 
) s 
ON (p.PRODUKTID = s.PRODUKTKID) 
WHEN MATCHED THEN 
UPDATE SET VYROBNA_CENA = s.celkova; 

Хотя я бы всегда использовал синтаксис соединения

MERGE INTO produkt p 
    USING 
(
    SELECT ZLOZENIE.PRODUKTKID, SUM(ZLOZENIE.MNOZSTVO*MATERIAL.CENA) as celkova 
    FROM MATERIAL 
     JOIN ZLOZENIE ON ZLOZENIE.MATERIALID=MATERIAL.MATERIALID 
    GROUP BY ZLOZENIE.PRODUKTKID 
) s 
ON (p.PRODUKTID = s.PRODUKTKID) 
WHEN MATCHED THEN 
UPDATE SET VYROBNA_CENA = s.celkova 
-1

После работы основан на вашем SQL скрипкой и базы данных MySQL.

Измените все десятичные столбцы в сценариях создания от целых чисел до десятичных. Ниже приведены обновленные сценарии создания

CREATE TABLE produkt 
    (`PRODUKTID` int, `NAZOV` varchar(47), `VYROBNA_CENA` decimal(10,2)); 

CREATE TABLE zlozenie 
    (`PRODUKTKID` int, `MATERIALID` int, `MNOZSTVO` decimal(10,5)); 

CREATE TABLE material 
    (`MATERIALID` int, `CENA` decimal(10,2)); 

sqlfiddle с обновляемых таблиц и запросов: http://sqlfiddle.com/#!2/0242f/6

запроса для обновления таблицы produckt

update produkt INNER JOIN 
(select ZLOZENIE.PRODUKTKID,sum(ZLOZENIE.MNOZSTVO*MATERIAL.CENA) as celkova 
from MATERIAL, ZLOZENIE 
where ZLOZENIE.MATERIALID=MATERIAL.MATERIALID 
group by ZLOZENIE.PRODUKTKID) ZM 
on produkt.PRODUKTKID = ZM.PRODUKTKID 
set produkt.VYROBNA_CENA = ZM.celkova 

Позвольте мне знать, если это не то, что вы после

+0

спасибо, я получаю ORA-00971: отсутствует ошибка ключевого слова SET. я попытаюсь выяснить, где проблема .. – ivanz

+0

Синтаксис MySQL отличается от синтаксиса Oracle. Так что это решение не будет работать, увы. – APC

+0

Севда, разве вы не используете MySQL? – Jasti

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