对了,我用SQL SERVER.感觉要用表子查询。

解决方案 »

  1.   

    select a.s_yjdm,a.s_ckdm,a.s_ph,a.f_rksl from kcqk a,
    (select s_yjdm,s_ckdm,s_ph
    from kcqk
    group by s_yjdm,s_ckdm,s_ph having count(*) > 1) as bwhere a.s_yjdm=b.s_yjdm and a.s_ckdm=b.s_ckdm and a.f_rksl=b.f_rksl 
      

  2.   

    select * from kcqk a,
    (select s_yjdm,s_ckdm,s_ph,count(*)
    from kcqk
    group by s_yjdm,s_ckdm,s_ph having count(*) > 1) b
    where a.s_yjdm=b.s_yjdm 
    and a.s_ckdm=b.s_ckdm 
    and a.s_ph=b.s_ph
      

  3.   

    谢谢两位的帮助,不过完全正确的写法如下:
    select a.s_yjdm,a.s_ckdm,a.s_ph,a.i_rksl,a.i_sjsl,a.m_rkdj from kcqk a,
    (select s_yjdm,s_ckdm,s_ph
    from kcqk
    group by s_yjdm,s_ckdm,s_ph having count(*) > 1) b
    where a.s_yjdm=b.s_yjdm 
    and a.s_ckdm=b.s_ckdm 
    and a.s_ph=b.s_ph 
    to hailong525(风云):
    1、好象是b中不能有聚集函数吧:有count(*)时返回错误:No column was specified for column 4 of 'b'.
    2、使用*会列出两个表中所有数据。
    谢谢!明天结贴.
      

  4.   

    1.to goldg(); b中可以有聚组函数,不过给字段要取别名,只是在这里这个字段没有必要取出。
    2.即使你将s_yjdm,s_ckdm,s_ph相同的项全部给列出来,也没有太大意义,因为你还是要聚组以后才能把数据导回去。
    3.如果s_yjdm,s_ckdm,s_ph相同的记录中,其他字段的值如果不一样,你怎么合并?
    4.按照你建表的思路考虑,好像是同一仓库同一批次的元件可以有相同元件代码的两条记录,那有为什么要查看s_yjdm,s_ckdm,s_ph三个字段呢?
      

  5.   

    谢谢Kradwang(猕猴桃),b中使用聚组函数,我过会再试试。
    不过我是在导数据,他以前的表的结构是:
    id 种子列
    s_yjdm,元件代码
    s_ckdm,仓库代码
    s_ph,  批号
    批号为六位的日期,例如:'010628',所以同一天一个仓库的同一种元件多次入库在我的表中就成了重复数据,而我的批号是这样设置的:‘01062801’,后两位为序列号。所以我要求得到的是每一条的明细,然后将'010628'类型转化为‘0106280X’类型。我现在做的是将如上b中count(*) = 1的update,count(*)>1的用手工改,幸亏只有几十条数据。谁能不能够,将多条'010628'的重复数据加上序列号转化为‘0106280X’类型。虽然这一次没用到,但大家探讨探讨。
    提高帖子的分数先!
      

  6.   

    这样一个问题还讨论什么阿!
    当然有方法阿!
    第一部是建立一个和这个表一样的表但是要加上一个字段iid identity
    然后把你的数据导入到这个表kcqk1
    第二部生名cursor找到所有
    重复的纪录
    declare kk cursor  for 
    select s_yjdm,s_ckdm,s_ph,count(*)
    from kcqk1
    group by s_yjdm,s_ckdm,s_ph having count(*) > 1 open kkkfetch next from kk
    into @k1,@k2,@k3,@k4while @@FETCH_STATUS = 0
    begin
      --求出来这个s_yjdm,元件代码s_ckdm,仓库代码s_ph的最大的iid和最小的iid
       select @k5=min(iid),@k6=max(iid) from kcqk1 where s_yjdm=@k1
    and s_ckdm=@k2 and s_ph=@k3 
         select @k=0
          while @k<@k4
           begin
            update kcqk1
            set kcqk.s_ph=kcqk.s_ph+@k+1
            where s_yjdm=@k1 and s_ckdm=@k2 and s_ph=@k3  and iid=@k5+@k1
            select @k=@k+1
           end
       fetch next from kk
       into @k1,@k2,@k3,@k4
      end  
    close kk
    DEALLOCATE kk
    最后
    delete from kcqk
    还要把数据导入
    insert into kcqk
    select ... from kcqk1
    drop table kcqk1
    不知道明白了没有
      

  7.   


    select field1 from tablename x where rowid <(select max(rowid) from tablename where field1=x.field1);
      

  8.   

    谢谢wwl007(疑难杂症),高手毕竟是高手。
    看不明白update中的iid=@k5+@k1是什么意思,好象循环不能定位s_yjdm,s_ckdm,s_ph相同的iid,觉得还是用嵌套游标。第一个游标如上,第二个游标列s_yjdm,s_ckdm,s_ph相同的所有列。
      

  9.   

    这样的SQL我用过很多啊。只要
    select l.s_yjdm,
           l.s_ckdm,
           r.s_ph,
           r.s_yjdm,
           r.f_rksl,
           r.f_xcsl,
           r.m_rkdj
    from kcqk l
    join kcqk r
    on   l.s_yjdm = r.s_yjdm
         l.s_ckdm = r.s_ckdm
    group by l.s_yjdm,
             l.s_ckdm,
             l.s_ph,
             l.s_yjdm,
             l.f_rksl,
             l.f_xcsl,
             l.m_rkdj
             r.s_yjdm,
             r.s_ckdm
    having count(r.s_yjdm)>1
      

  10.   

    to wwl007(疑难杂症):
    例如下表:
    iid     s_yjdm    s_ckdm    s_ph ...
    1        001       001      010628
    7        001       001      010628
    8        001       001      010628
    12       001       001      010628
    我觉得用循环并不能将iid = 1的列的s_ph更新为0106281,iid = 7的列的s_ph更新为0106282...循环很难区分iid=1和iid=7的上述行。所以我觉得还是应该用嵌套游标。
    to ccat(阿猫):
    谢谢关注!第一个问题已经解决了,看看第二个问题吧。
      

  11.   

    我说你怎么了!我开始设置的临时表不可能出现这样的字段!他们一定是连续也!
    你想也是啊!我设置了一个identity字段!不对其进行删除!一次性插入!你说会不连续吗?
    我真是不明白!你的数据会怎么出现!如果你的数据真的出现了(我说的使用我的方法,我真的
    会佩服你的)
    不信你就试验一下!看看这个可能性有没有!
    任何两个我说的表都可以!好好想了在回答!ok!
    谢谢了