select distnact * from table

解决方案 »

  1.   

    首先你的数据库是sql还是oracle?
      

  2.   

    select distinct * from table  取不同的行select test from table group by test  把表table按字段test分组
      

  3.   

    不行,不是这么简单。
    每个记录可能是一个单一值,也可能是一个字符分隔的值序列。
    我要的是用SQL语句分割出所有的单值来。distinct干不了这个活。
      

  4.   

    那就用存储过程吧.存储过程里用游标检索table,用两层循环fetch游标数据和分析
      

  5.   

    select test from mytable where charindex(',',test)=0
    union 
    select left(test,(charindex(',',test)-1)) from mytable where  charindex(',',test)>0
    union 
    select substring(test,(charindex(',',test)+1),len(test)-charindex(',',test)) from mytable 
    where  charindex(',',test,charindex(',',test)+1)=0 and charindex(',',test)>0
    union 
    select substring(test,(charindex(',',test)+1),charindex(',',test,charindex(',',test)+1)-charindex(',',test)-1) 
    from mytable 
    where  charindex(',',test,charindex(',',test)+1)>0 
    union 
    select substring(test,charindex(',',test,charindex(',',test)+1)+1,len(test)-charindex(',',test,charindex(',',test)+1)) 
    from mytable 
    where  charindex(',',test,charindex(',',test)+1)>0 and charindex(',',test,charindex(',',test,charindex(',',test)+1)+1)=0
    --如果更多层就需要更加多的Union 
    --也可使用临时表处理
      

  6.   

    To XZisgood: 
       谢谢,分肯定是给加的。
       只是我想用SQL就是为了加速,你用循环的方法,就没有什么意思了。
     
    To ded:
       这个方法有点勉强,不过也算是一个方法。 呵呵。
       可惜SQL不支持递归。To XZisgood: 
       我还要稍微等一下,看看有没有更好的回答。回头给诸位多加些分。
      

  7.   

    最好使用临时表,先写一函数将用“,”号分隔的内容切开放入临时表,再对临时表使用DISTINCT。
    PS:我觉得你的数据结构设计有问题,为什么要这样设计呢?
      

  8.   

    在Sql server中游标处理办法,DeD的办法属手工处理,灵活性不太高.
    create procedure splitword
    as
    declare @tstr varchar(100)
    declare c cursor for select * from abc
    insert into temptb select name from abc where patindex('%,%',name)=0
    open c
    fetch next from c into @tstr
    while @@fetch_status =0 begin
    while patindex('%,%',@tstr)>0  begin
    insert into temptb values(substring(@tstr,1,patindex('%,%',@tstr)-1))
    set @tstr=substring(@tstr,patindex('%,%',@tstr)+1,len(@tstr)-patindex('%,%',@tstr))
    end
    fetch next from c into @tstr
    end
    select distinct name from temptb order by name
    close c
    deallocate c
      

  9.   

    我补充一下,我的过程假设目标表结构为abc(name varchar(100)),数据库中可以使用select into语句(select into/bulkcopy 属性为on).过程中使用patindex而不用charindex实为习惯所至,两者作用相同.
    说到设计库,如果是我,不会这样设计,应该搞清楚关键词的个数(一般至多5个),直接给它5个字段岂不更直接,简单?
      

  10.   

     guo(老伟) 的做法比较灵活,但是如果我在客户端对上面的SQL自动拼装也可以弥补
    灵活上的不足,但是会受到ADO(我是用这个东西处理数据库)的相应SQL长度的限制
    但是有一点速度上来说上面一种会快一些。
    另外,我也不同意对数据库这样的设计,即使是这样,认为还是把数据拿回客户端自己处理
    比较方便
      

  11.   

    我在做相关新闻生成时碰到相同的问题,先前的处理办法是使用专用程序进行处理,处理完后将结果存入相关表,当将数据取到客户端后进行字段分切,此时CPU占用率达到90%, 如果将关键词直接分字段存放,这个费时的操作可以取消, 整体系统的效率会很高,数据库端只会增加字段数量,性能上不会有下降. 实际应用中不可能使用很多的关键词,3,4个足够了.当将相关新闻做成触发器后,整体性能很大提高.
      

  12.   

    我有一个不成熟的想法,大家看看可不可行:    利用文本文件进行转换第一步,先把表中的数据输出到一个文本文件中,设定记录之间用逗号(,)隔开;第二步把这个文本文件输入到数据库中的另外一个只有一个字段的表中,设定记录之间的间隔是逗号(,);第三步就是最后的检索了。(手头没有SqlServer,没法实验)
    关键是第一步,我记得用SqlServer的工具手动是可以实现的,就是不知道能不能用语句实现,输出文件假设为c:\data.dat。
    第二步是可以的,用语句BULK INSERT myTable1 FROM 'c:\data.dat'
    WITH (
        DATAFILETYPE = 'char',
        ROWTERMINATOR = ','
    )最后再对这个新的表进行检索(distingush)
      

  13.   

    如果用ms sql
    select test into #test_temp from mytable 
    select test into #temp from mytable where 1=2
    while exits (select * from #test_temp )
    begin
         insert into #out select test from #test_temp where where charindex(',',test)=0
         insert into #out select substring(0,charindex(',',test)) from #test_temp where charindex(',',test)=0
         delete from #temp 
         insert into #temp select substring(0,charindex(',',test)) from #test_temp where charindex(',',test)=0
         delete from #test_temp
         insert into #test_temp select #temp          
    end
    select distinct * from #out
      

  14.   

    哇,这里有高手,来看一下我的问题http://www.csdn.net/expert/TopicView.asp?id=70150
    w102272,对不起,借用了你的地方。先致歉。