日期:2014-05-18  浏览次数:20577 次

一个数据库的处理解决问题??
表: cpxxb
字段:id(自动增长),gsmc(公司名称),cpbh(产品编号),oebh(OE编号)
例如:1 甲公司 00001 oe00001
  2 甲公司 10001 oe00002
  3 甲公司 00001 oe00002
  4 乙公司 10001 oe00003
  5 乙公司 04004 oe00001
  6 乙公司 10001 oe00003
  7 丙公司 00001 oe00004
  8 丙公司 03001 oe00004
  9 丙公司 03001 oe00005
  10 丙公司 04501 oe00006
  11 丙公司 04501 oe00007
  12 丁公司 00001 oe00008
  13 丁公司 23001 oe00001
  14 丁公司 00001 oe00005
  15 戊公司 56001 oe00008
  16 戊公司 56001 oe00003
  。。。。。。。。。。。。。。

说明:cpbh(产品编号)是每个公司自己命名的,可能与别的公司相同但可能不是同一个产品,oebh(OE编号)是每个公司之间通用的,就是一个oebh(OE编号)对应的cpbh(产品编号)可能不同,但是产品是一样的。一个cpbh(产品编号)可能对应多个oebh(OE编号),一个oebh(OE编号)也可能对应多个cpbh(产品编号)。例如:甲公司的产品编号00001对应的是OE编号是oe00001,oe00002,同时 OE编号oe00001对应的甲公司的产品编号00001,也对应的乙公司的产品编号04004和丁公司的产品编号23001,那说明:甲公司的产品编号00001和乙公司的产品编号04004和丁公司的产品编号23001对应的都是同一个产品,那间接与OE编号oe00002,甲公司的产品编号10001,OE编号oe00003,乙公司的产品编号10001,戊公司的产品编号56001,OE编号oe00008,丁公司的产品编号00001,OE编号oe00005,丙公司的产品编号03001 对应的产品都是同一个。。。。

我的问题是:当用户输入oebh(OE编号)或cpbh(产品编号) 查询:能显示这个oebh(OE编号)或cpbh(产品编号)对应的产品所对应的所有gsmc(公司名称)及该公对应的cpbh(产品编号),同时显示所有通用的oebh(OE编号)...,如果按一般的做法是:查到与用户输入的oebh(OE编号)相同的所有oebh(OE编号),再通过查到的每个oebh(OE编号)所对应的公司的cpbh(产品编号),再根据每个公司的cpbh(产品编号)对应的oebh(OE编号)查,这就要用到递归算法。。。这样对于几百万条数据效率太慢了,请问各位大虾怎么处理这个数据库???(可以给这个表加字段,也可以增加表)

请各位大虾指教。。。。小弟急用。。谢谢!!!!!!!!





------解决方案--------------------
SQL code

alter table cpxxb add citems_net varchar(20) 

update cpxxb
set citems_net=cpbh

update cpxxb
set citems_net=b.citems_net
from cpxxb a,(select oebh,min(citems_net) as citems_net  from cpxxb group by oebh) b
where a.oebh=b.oebh

------解决方案--------------------
关联的话会关联一连串,这个一连串的数据之间有关系,而且里面的数据不会和里面以外的数据有关系,这个一连串的数据编一个号,就是citems_net。如果查询的oebh或cpbh返回一个citems_net的值的话,用这个citems_net值返回所有列。大概是这个思路
------解决方案--------------------
现在没有sql,实验不了

不可能那么慢吧?

或者把这个子查询放到一个临时表上

update cpxxb
set citems_net=b.citems_net
from cpxxb a,(select oebh,min(citems_net) as citems_net from cpxxb group by oebh) b
where a.oebh=b.oebh

改成

select oebh,min(citems_net) as citems_net into #ls1 from cpxxb group by oebh

update cpxxb
set citems_net=b.citems_net
from cpxxb a,#ls1 b
where a.oebh=b.oebh
------解决方案--------------------
实时更新是不太可能,一个插入操作关联到两个串的话需要大范围的更新,大侠们有什么好办法的话提一下意见吧
------解决方案--------------------
表这么大,一天或者几天做一个为了查询一个镜像吧

镜像表上主键聚集索引加在citems_net,id 然后cpbh和oebh挂索引
------解决方案--------------------
建索引 处理吧 优化查询速度 
查询条件 都差不多。