表的关联问题,有点复杂!难道真的要我去修改表吗...

Doane 2008-07-16 03:15:25
我表达能力不太好,一句两句说不清,请耐心看完,谢谢.

有三个表,xs(销售表),sp(商品表),kc(库存表),sp表的主键是sp_no,xs表和kc表中都有一个sp_no和sp表关联起来.
问题出来了:有一种商品A同时存在于两个仓库G,H,那这样这种商品在kc表里就会有两条纪录了

我在编辑销售单的时候,销售单的那个表的数据源是这样的
select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs,sp,kc
where (xs.sp_no = sp.sp_no) and (kc.sp_no = sp.sp_no)

那我在写数据的时候,将商品A输入进去,选择仓库G,保存.
然而当我再打开这个销售单的时候,里面的数据会变成两条一模一样的,而不是一条了...

说了那么多,归根结底,意思就是,从xs表中检索销售单的时候,先xs表,然后再sp表,然后又kc表,而这个sp_no在kc表中有两条纪录,这样检索的时候就变成两条纪录了

不知道我说的大家明白没有?我不想修改表呀,修改了里面的数据就没有了...我该怎么办啊?
QQ:253934980(隐身)
不甚感激!
...全文
87 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Doane 2008-07-17
  • 打赏
  • 举报
回复
解决了,谢谢大家,结帖!
AFIC 2008-07-16
  • 打赏
  • 举报
回复
难道你的库存表没主键吗……
Doane 2008-07-16
  • 打赏
  • 举报
回复
AFIC,你的方法不行,我刚试了,还是有重复的两条纪录

ying_wzm是可以的,不过要用sum聚合函数,如果不用的话就好了
编程夜猫 2008-07-16
  • 打赏
  • 举报
回复
若每个列都一样,用Distinct 也行
Doane 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 AFIC 的回复:]
我仔细一看,你应该要的是这个吧?

select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
SUM(kc.kc_num )
from xs,sp,kc
where (xs.sp_no = sp.sp_no) and (kc.sp_no = sp.sp_no)
GROUP BY sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...

要不…
[/Quote]

你的意思是后面加上Group By就可以了?我原先也试过的,不过Group By之后就加了一个sp_no,所以出错,你把所有要读取的字段都加上不知道行不行,我试试
还有,我不想把两个仓库的库存数量加在一起,每个仓库的数量是单独的,用户想从G仓库销售100个,而G仓库没有那么多,但是加上H仓库的数量就有那么多了,那不是就出错了吗
Doane 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ying_wzm 的回复:]
select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs
left join sp on xs.sp_no = sp.sp_no
left join
(select sp_no,kc_num=sum(kc_num) from kc group by sp_no ) kc
on kc.sp_no = sp.sp_no

试试
[/Quote]

刚才去试你这个了,结果是对的,可以实现我的问题,不过用了kc_num=sum(kc_num)这个之后数量就不对了
比如A商品在G库的kc_num是100,在H库的kc_num是97,我本来只是想将在G库中的A商品出库,但是你这样一来kc_num就变成了197,我判断出库数量不能大于库存数量时就会出错了
AFIC 2008-07-16
  • 打赏
  • 举报
回复
我仔细一看,你应该要的是这个吧?

select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
SUM(kc.kc_num )
from xs,sp,kc
where (xs.sp_no = sp.sp_no) and (kc.sp_no = sp.sp_no)
GROUP BY sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...

要不然,你的数也对不上啊。
AFIC 2008-07-16
  • 打赏
  • 举报
回复
你不是说两条纪录是一样的吗?
那选哪个有区别吗?
Doane 2008-07-16
  • 打赏
  • 举报
回复
我只是想把重复的那条去掉而已,不是只读一条啊,其他不重复的还是要的呀,有时出库不是只出一种商品啊

你看能不能相同sp_no的只读其中一条或者相同xs_no的只读其中一条?
ying_wzm 2008-07-16
  • 打赏
  • 举报
回复
select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs
left join sp on xs.sp_no = sp.sp_no
left join
(select sp_no,kc_num=sum(kc_num) from kc group by sp_no ) kc
on kc.sp_no = sp.sp_no

试试
Doane 2008-07-16
  • 打赏
  • 举报
回复
晕,终于明白了,可是你这样不行啊,这样数据是只剩一条了,但是我其他不一样的纪录也没有了啊
AFIC 2008-07-16
  • 打赏
  • 举报
回复
就是你说的
两条纪录是一样的,只检索一条
Doane 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 AFIC 的回复:]
SQLSERVER
select TOP 1 sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs,sp,kc
where (xs.sp_no = sp.sp_no) and (kc.sp_no = sp.sp_no)

ORACLE

select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
f…
[/Quote]

我太激动了,你加了个TOP 1是什么意思,如此神奇!可以了,终于可以了...
Doane 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ying_wzm 的回复:]
select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs
left join sp on xs.sp_no = sp.sp_no
left join kc on kc.sp_no = sp.sp_no
[/Quote]

试了,不行,还是读出来两条重复的数据..
AFIC 2008-07-16
  • 打赏
  • 举报
回复
SQLSERVER
select TOP 1 sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs,sp,kc
where (xs.sp_no = sp.sp_no) and (kc.sp_no = sp.sp_no)

ORACLE

select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs,sp,kc
where (xs.sp_no = sp.sp_no) and (kc.sp_no = sp.sp_no)
AND ROWNUM = 1
ying_wzm 2008-07-16
  • 打赏
  • 举报
回复
select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs
left join sp on xs.sp_no = sp.sp_no
left join
(select sp_no,kc_num=sum(kc_num) from kc group by sp_no ) kc
on kc.sp_no = sp.sp_no
rightyeah 2008-07-16
  • 打赏
  • 举报
回复
一般用只商品id作为标识的系统,到货和发货都是多条记录(每个id,有多条记录)的,是不能直接、间接关联的。如果库存也有多个,那么更不能互相关联了。
解决的办法是用到货id来唯一标识每一批到货,在所有的库存、发货表内都记录所发的商品的到货id,就可以了
Doane 2008-07-16
  • 打赏
  • 举报
回复
两条纪录是一样的,仓库也一样,这样的话我出库就相当于出了两次

补充一下,每条纪录有一个xs_no,这个xs_no是xs表的主键,刚才那种出现了重复两条纪录的情况,这两条纪录的xs_no也是一样的,有没有办法在检索时相同xs_no的数据只检索一条?我想这样也许可以解决我的问题
ying_wzm 2008-07-16
  • 打赏
  • 举报
回复
select sp.sp_py,
xs.xs_date,
xs.sp_no,
xs.xs_name,
xs.xs_num,
xs.xs_money
...
kc.kc_num
from xs
left join sp on xs.sp_no = sp.sp_no
left join kc on kc.sp_no = sp.sp_no
编程夜猫 2008-07-16
  • 打赏
  • 举报
回复
关键在于你是如何存储销售单的,一般来说,你取得两条记录是对的,因为些时你还没有确定从哪个仓库里出佛山。
问题在于,你存储销售单时,既然已经先定了从G仓库出货,那H仓库的那条记录就要忽略掉,或排除掉。
加载更多回复(2)

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧