表: 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编号)查,这就要用到递归算法这样对于几百万条数据效率太慢了,请问各位大虾怎么处理这个数据库???(可以给这个表加字段,也可以增加表)请各位大虾指教。小弟急用。。谢谢!!!!!!!!

解决方案 »

  1.   


    alter table cpxxb add citems_net varchar(20) update cpxxb
    set citems_net=cpbhupdate 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 * from cpxxb where citems_net in (select citems_net where cpbh=?? or oebh=?? group by citems_net)
      

  2.   

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

  3.   

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

  4.   

    3楼,5楼和我想的一样,关键是一连串的数据编一个号这执行的太慢了一天才能执行加2W-5W条数据,400W的数据这也要好几个月呀
      

  5.   

    现在没有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 oebhupdate cpxxb
    set citems_net=b.citems_net
    from cpxxb a,#ls1 b
    where a.oebh=b.oebh
      

  6.   

    看的特别的晕,是不是名字起的不够明确,缺少需求背景是不是:
    oebh即统一编号,对应一个具体产品,可以是多个公司的产品:多个gsmc+cpbh组合
    ?问题是查询,还是录入?
    查询好像一个个反着推查就行了
    录入好像也没什么特别的限制
      

  7.   

    使用存储器,使用sql语句读出所有数据肯定慢了
      

  8.   

    表这么大,一天或者几天做一个为了查询一个镜像吧镜像表上主键聚集索引加在citems_net,id 然后cpbh和oebh挂索引
      

  9.   

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

  10.   

    就是所有关联的oebh全部显示出来