【问题标题】:Oracle update statement using multiple columns使用多列的 Oracle 更新语句
【发布时间】:2014-12-18 22:35:49
【问题描述】:

我正在尝试使用另一个包含产品材料和该材料数量的表格来更新我的产品价格

我的表是 produkt (PRODUKTID int, NAZOV varchar(47), VYROBNA_CENA int) 表格材料(MATERIALID int,CENA numeric); 表 zlozenie (PRODUKTKID int, MATERIALID int, MNOZSTVO int);

我要做的是将 sum(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

第二个是价格为空的表格产品(cena),我想将 sum 的结果放入 cena 列

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

sql 摆弄表和查询http://sqlfiddle.com/#!2/e183f/2

谢谢

【问题讨论】:

  • @benji 请注意这篇文章是oracle,你的链接是sql server。可能有更具体的方法来处理这个基于平台。此外,您的链接没有显示如何处理聚合。
  • @paqogomez 但它不是同一个概念吗? update table set column = subquery?
  • @benji - 相同的概念,但 Oracle 不支持 UpDATE 中的 INNER JOIN 语法(尽管如果支持它会非常整洁)

标签: sql oracle sql-update


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    以下工作基于您的 sql fiddle 和 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

    查询更新产品表

    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
    

    如果这不是你想要的,请告诉我

    【讨论】:

    • 谢谢,我收到 ORA-00971:缺少 SET 关键字错误。我会尝试找出问题所在..
    • MySQL 语法与 Oracle 语法不同。所以这个解决方案行不通,唉。
    • Sevdah,你不使用 MySQL 吗?
    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多