pl/sql developer 中,两表相减,保存结果

这里有两张表格,分别如下
kucun,sale.
分别表示着库存量,日销售
需要将 库存减去日销售,并把结果更新到库存中。
琢磨了昨天整整一天,实在无法表达,请教各位大大帮忙写一段命令
-------------------------
已知:需要先将sale中的数据按model spec color求和,不然会出现“子查询多行值”的错误信息。
我能提供的还有以下这段代码
------------------------------------
SELECT "MODEL","SPEC","COLOR",SUM(FIVE),sum(SIX),sum(SEVEN),sum(EIGHT),sum(NINE),sum(TEN)
FROM sale
group by MODEL,SPEC,COLOR;
-----------------------------------
思路是有两种方案:
A直接跨表update
B将sale中的数据进行上面那段代码的整理后,update到一个新表,然后再与kucun,进行计算
-------------
可惜我也不知道这个思路对不对
-------------------------------------------
请各位高手赐教一下,写一段直接复制进去能用的代码,小弟感激不尽。
(工作原因,导致时间紧迫,所以急需现成的...谢谢)
各位高手尽心尽意帮忙,小弟感激不尽。
各位的方案我都一一试验,小弟来反馈下效果。
wyehua 兄的两段命令都是返回一行的成功效果,其他几行全部清空为0
lelinghong 兄的命令也是通不过...
我的oracle版本是10g...

建议写一个触发器:
当销量表插入一条的时候,去库存表减去刚才型号的商品数量。

或者两表连接相减:
select A.* from
kucun A join (SELECT "MODEL","SPEC","COLOR",SUM(FIVE) s1,sum(SIX) s2,sum(SEVEN) s3,sum(EIGHT) s4,sum(NINE) s5,sum(TEN) s6
FROM sale
group by MODEL,SPEC,COLOR;
) B
where A.model=B.model and A.spec=B.spec and A.color = B.color
上面的语句就可以查出model spec color 总数量以及销售的总数量s1,s2....
用update相减就可以。
update
kucun A join (SELECT "MODEL","SPEC","COLOR",SUM(FIVE) s1,sum(SIX) s2,sum(SEVEN) s3,sum(EIGHT) s4,sum(NINE) s5,sum(TEN) s6
FROM sale
group by MODEL,SPEC,COLOR
) B
set A.five=A.five-s1 .......--省略
where A.model=B.model and A.spec=B.spec and A.color = B.color
--ORACLE应该是这么写,不知道好不好用,你自己再试一下。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-03
您好!
看了下您的需求 两表数据相减我写了两种方法,您试试

select * from kucun minus select * from sale;
表记录不能有重复

如果存在主键的情况下可以这样:
select kucun.* from aa kucun,bb sale where kucun.c = sale.c(+) and sale.c is null;
这是效率最高的写法

SQL---
update kucun set (SELECT "MODEL","SPEC","COLOR",SUM(FIVE),sum(SIX),sum(SEVEN),sum(EIGHT),sum(NINE),sum(TEN)
FROM sale
group by MODEL,SPEC,COLOR;) where (select * from kucun minus select * from sale);
第2个回答  2010-09-03
to lelinghong:
你怎么不试一试你的能不能运行?谁试谁知道。

真好笑,你的只不过是比我的多了个
where (a.model, a.spec, a.color) in
(SELECT "MODEL", "SPEC", "COLOR" FROM sale)
你不觉得你这个有些多余吗?在更新的时候我最下边的
WHERE A.MODEL = B.MODEL
AND A.SPEC = B.SPEC
AND A.COLOR = B.COLOR
这几条语句已经把它们给关联好了,再加一次又有何用?只会降低新速度。而且语法错误一堆,你就是通过这种方法,让我把答案更新,然后排在你的后边吧?呵。。。

很久没用Oracle的多表更新了,特意看了一下Oracle多表的语法,下边的语法完全是正确,
把它直接复制到pl/sql deveploer中执行就可以了,看一下结果是不是你想要的。

UPDATE KUCUN A SET (FIVE,SIX,SEVEN,EIGHT,NINE,TEN) =
(SELECT A.FIVE-S5, A.SIX-S6, A.SEVEN-S7, A.EIGHT - S8, A.NINE - S9, A.TEN - S10
FROM (SELECT MODEL,SPEC,COLOR,SUM(FIVE) S5,SUM(SIX) S6,SUM(SEVEN) S7,SUM(EIGHT) S8,SUM(NINE) S9,SUM(TEN) S10
FROM SALE
GROUP BY MODEL,SPEC,COLOR) B
WHERE A.MODEL = B.MODEL
AND A.SPEC = B.SPEC
AND A.COLOR = B.COLOR)
第3个回答  2010-09-03
不用多说了,让楼主来推最佳答案。
跟你多说也无意义。
-------------
这种人都有,无言以对。就算我沉底了,你也不是正确答案。
你不会多弄几条数据做做测试?急急忙忙贴出来赚分,结果是错的,还不让人批评。
-----------------------------
上边的老兄错了,你这样会把没有卖的库存都消掉。看我的这个。
oracle 10G 测试通过。没有问题。
UPDATE kucun a
SET (a.five, a.six, a.seven, a.eight, a.nine, a.ten) = (SELECT a.five -
b.five,
a.six -
b.six,
a.seven -
b.seven,
a.eight -
b.eight,
a.nine -
b.nine,
a.ten -
b.ten
FROM (SELECT "MODEL",
"SPEC",
"COLOR",
SUM(FIVE) as five,
sum(SIX) as six,
sum(SEVEN) as seven,
sum(EIGHT) as eight,
sum(NINE) as nine,
sum(TEN) as ten
FROM sale
group by MODEL,
SPEC,
COLOR) b
WHERE a.model =
b.model
and a.spec =
b.spec
and a.color =
b.color)
where (a.model, a.spec, a.color) in
(SELECT "MODEL", "SPEC", "COLOR" FROM sale)
相似回答