SQL求救!!!!!!!!!!!!!!!!!!(50分)

  • 主题发起人 主题发起人 Sammo
  • 开始时间 开始时间
westboy2000大哥!!
我这个数据表要同时使用ID和NAME才能区分出唯一的数据的!!
我现在先试试去!!谢谢您!!:)
 
Westboy2000大哥!!
因为我这个数据表要同时判断ID和NAME都不在表里才能区分唯一的数据!
我可不可以改成这样:
insert into Goods (ID,Name,Store,StoreTun)
SELECT ID,Name,SUM(Buy-Supply),SUM(Supply-GetTun)
FROM Supply
where ((ID not in (select ID from Goods) and (NameE not in (select Name from Goods))
group by ID,Name;
 
也就是说,我的表里不能够同时有两个ID=1001和Name="小食"的记录,
但可以存在这样的记录:ID=1001,Name="小食"和ID=1001,Name="芒果"
 
本来加where条件的目的是为了查出Goods表中已经存在的记录,则新增的记录不能是那些记录,
如果已经存在 id=1,name='张三' 的数据,最好是能将两个连接起来查询,这样才能唯一,
如果只用一个id,那么象这样的数据 id=1,name='李四' 也不能写进去了,这样,插入的数据就会减少,
同样,只用name作条件也不行,而且可以很容易想到,用你写的 id and name 的方法,
比用一个字段作条件插入的数据量会更加减少,所以,这样是不行的,会导致插入数据数目的不正确。
更好的方法我暂时还没有,你再想想吧。

一个问题:为什么两个表都有IN和Name?这样岂不是不符合第二范式?
我想一个ID就可以唯一标示了,干吗还要加Name呢?如果你的数据库设计能符合第二范式,那么用我给你写的SQL就可以解决了。
你不能重新调整一下数据库设计么?说不定你以后还会遇到更复杂的查询呢。
 
非常感谢Westboy2000大哥给小弟如此详尽的赐教!!谢谢!!!!!!
我把我的表的结构贴出来给大哥看看!!刚才的数据表Goods就是表C:
客户基本资料库结构(表名:A):
┌───────┬────┬──┬──┐
│客户编号(主键)│客户名称│电话│地址│
├───────┼────┼──┼──┤
│1000001 │张三 │ │ │
├───────┼────┼──┼──┤
│1000002 │李四 │ │ │
└───────┴────┴──┴──┘

货物品名编码库结构(表名:B):
┌─────┬──┐
│编码(主键)│品名│
├─────┼──┤
│1111111 │景田│
├─────┼──┤
│2222222 │椰树│
└─────┴──┘


客户购水与存桶结存库结构(表名:C):
┌───────┬────┬──┬──┬──┐
│自动编号(主键)│客户编号│品名│余量│存桶│
├───────┼────┼──┼──┼──┤
│1 │1000001 │景田│ 10 │ 5 │
├───────┼────┼──┼──┼──┤
│2 │1000001 │椰树│ 20 │ 10 │
├───────┼────┼──┼──┼──┤
│3 │1000002 │景田│ 10 │ 5 │
├───────┼────┼──┼──┼──┤
│4 │1000002 │椰树│ 20 │ 10 │
└───────┴────┴──┴──┴──┘
 
大哥可否提供QQ给小弟!?:)
 
对于上面的几个表,客户购水与存桶结存库的结构我该怎么建立才好管理呢?
 
我一年多不上QQ了,而且我是在公司上网,也不能上QQ的。
有问题你可以写到我的信箱 westboy2000@263.net。

我看了你上面的设计,不错啊。那么Supply表又是什么结构呢?
而且,表C中的余量和存桶是什么关系啊?
 
谢谢westboy2000大哥!!!
Supply表是客户购水与供水明细资料库(表名:D):
┌───────┬────┬─────┬──┬──┬──┬──┬──┬──┐
│自动编号(主键)│客户编号│ 日期 │品名│购水│供水│余量│收桶│存桶│
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│1 │10000001│2001/10/25│景田│ 10 │ 5 │ 15 │ 0 │ 10 │
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│2 │10000001│2001/10/26│景田│ 0 │ 3 │ 12 │ 5 │ 8 │
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│3 │10000001│2001/10/25│椰树│ 20 │ 10 │ 30 │ 0 │ 20 │
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│4 │10000001│2001/10/26│椰树│ 5 │ 10 │ 25 │ 5 │ 25 │
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│5 │10000002│2001/10/25│景田│ 50 │ 20 │ 40 │ 0 │ 25 │
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│6 │10000002│2001/10/26│景田│ 0 │ 15 │ 25 │ 10 │ 30 │
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│7 │10000002│2001/10/25│椰树│ 20 │ 5 │ 35 │ 0 │ 15 │
├───────┼────┼─────┼──┼──┼──┼──┼──┼──┤
│8 │10000002│2001/10/26│椰树│ 10 │ 15 │ 30 │ 5 │ 25 │
└───────┴────┴─────┴──┴──┴──┴──┴──┴──┘
 
表C中的余量和存桶是之间可以说是关系不大!
余量是客户购买该种水后减去供水的数量的余量,即:Buy-Supply;
存桶是客户购买该种水后,供水的数量减去收回桶的数量的余量,即:Supply-GetTun
比如说:
101客户的景田水的余量为10桶,存桶为10个,购买了20桶景田水,同时又供水15桶,收回5个桶,
那么101客户的景田水的余量为:10+20-15=15桶
存桶的数量为:10+15-5=20个
 
明白了,你上面说的Goods表和Supply表的ID,Name字段指的是客户编号和品名,是吧?
以后不要叫什么大哥不大哥的了,我可不敢当,还是朋友相称吧。
看了你的表,其实C表是根据D表的数据统计生成的,是不是?其实,C表完全可以做成一个视图的。
视图中的数据在每次调用时动态生成,平时没有,它的调用方法跟表的调用方法完全一样。
上面的C表如果做成视图,那就不存在什么Insert和Update的判断问题了,只需要用Select就可以解决问题。
在Access2000中,视图的创建方法如下:
1、在设计界面中,选中左边的“查询”一项,然后双击“在设计视图中新建查询”,
会弹出一个标题为“显示表”的界面,直接关闭,不作操作。然后在下一个“选择查询”的界面中
单击右键,选择“SQL视图”,在里面写上下面的SQL,保存退出。
SELECT ID,Name,SUM(Buy-Supply) as Store,SUM(Supply-GetTun) as StoreTun FROM Supply group by ID,Name;
2、假设你将刚才的视图命名为s1,则调用时可以这样写:
select * from s1;
用法与一般的表完全一样,就是不能进行更改、新增、删除等操作。
3、如果按上面的方法建立了视图,那么你的C表就可以不要了,作查询、统计都可以从视图s1中取。
你看看这样能不能解决你的问题?
 
你这个豫剧如果在sql server里就能正确执行了
 
westboy2000兄!!谢谢!!完全可以解决问题啦!!!但不知速度方面怎么样?要是有上万个记录的话会影响吗?

我第一次使用ACCESS数据库,又是第一次来到大富翁,上天待我不错,
让我遇上westboy2000这样好的老大,小弟无法表达感激之情了!只能老土一句“谢谢啦”!
真的!!由于对ACCESS数据库和视图等方面的不熟悉,这个问题搞了我很久了!
再说我是刚刚从DOS数据库编程转到WINDOWS不久!所以问题多多了!!
得人恩果千年报!交此好友!此生无憾也!!!
小弟的Email:SammoChoi@21cn.com
     QQ:82968850
多多联系!多多交流!!:)
 
To hpretty:
小弟知道!有很多仁兄也告知小弟了!但无奈已经使用了ACCESS!
下次要考虑清楚再选用数据库了!!:)
 
接受答案了.
 
速度没有什么太大的问题,十几万记录的统计时间也不会太长,应该在可以忍受的范围内。[:)]
 
对了!westboy2000兄!
我要是想在视图里加上客户基本资料表(表名:A)的客户名称,怎么做呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
I
回复
0
查看
997
import
I
I
回复
0
查看
3K
import
I
后退
顶部