表 t1,有个字段aaa
ID   aaa
1    a1,a2
2    a2,a4
3    a8
4    
5    a9,a1需得到结果:
a1
a2
a4
a8
a9
若能按出现的次数排序就更完美了
先谢谢! 

解决方案 »

  1.   

    在程序中控制吧,不要把太多逻辑控制放到SQL语句中,况且这种东西好像不太好搞
      

  2.   

    一条sql语句搞不定,可能要考虑用到存储过程或者在程序里面控制
      

  3.   

    程序中这样处理的,不知道还有没有更高一点的效率,主要是集合操作这里            string strSql = "SELECT distinct  tag FROM Article where tag<>''";
                DataTable dt = db.ExecuteDataTable(strSql);
                List<string> tagList = new List<string>();
                foreach (DataRow dr in dt.Rows)
                {
                    foreach (string tmp in dr["tag"].ToString().Split(' '))
                    {
                        bool isNew = true;
                        foreach (string tmp2 in tagList)
                        {
                            if (tmp == tmp2)
                            {
                                isNew = false;
                                break;
                            }
                        }
                        if (isNew) tagList.Add(tmp);
                    }
                }
      

  4.   

    绝对支持在前台处理
    后台要对字符串处理很麻烦。其他没有什么,
    也就是创建一个临时表,储存两个字段,一个是a1.a4.a8这样的内容,一个放次数。
    然后用order by很容易就排出你想要的顺序。sql的帮助找一下字符处理就可以做出来了,不难的。
      

  5.   

    try...            foreach (DataRow dr in dt.Rows)
                {
                    string[] array = dr["tag"].ToString().Split(' ');
                    foreach (string tmp in array)
                    {
                        if (!tagList.Contains(tmp))
                            tagList.Add(tmp);
                    }
                }
      

  6.   

    很显然,要使用类似split的函数--1、建立split自定义函数
    create  Function Split(@Sql varchar(8000),@Splits varchar(10))
    returns @temp Table (a varchar(100))
    As
    Begin
    Declare @i Int
    Set @Sql = RTrim(LTrim(@Sql))
    Set @i = CharIndex(@Splits,@Sql)
    While @i >= 1
    Begin
    Insert @temp Values(Left(@Sql,@i-1))
    Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)
    Set @i = CharIndex(@Splits,@Sql)
    End

    If @Sql <> ''
    Insert @temp Values (@Sql)
    Return
    End
    --建立测试数据
    create table t1
    (id int identity(1,1),aaa varchar(1000))
    --插入数据
    insert into t1
    select 'a1,a2' union all
    select 'a2,a4' union all
    select 'a8' union all
    select '' union all
    select 'a9,a1'--获取数据
    declare @sql varchar(8000)
    set @sql = 'select distinct * from split('''
    select @sql = @sql + aaa + ',' from t1 where isNull(aaa,'')<>''
    if right(@sql,1)=','
    set @sql = left(@sql,len(@sql)-1)exec(@sql+ ''','','');')/*
    结果
    a                                                                                    --------------- 
    a1
    a2
    a4
    a8
    a9*/
      

  7.   

    什么需求要求要有这样的数据库结构啊???
    我觉得有百分之九十的可能是数据库设计不合理,要么就用XML字段得了,要么牺牲一点冗余吧!这样放在一个字段里,都不能看作一个集合,也用不了IN运算...
      

  8.   

    select aaa from t1 group by aaa
      

  9.   

    Select   convert(char(2),aaa ) form  t1  order by  convert(char(2),aaa )若都为两位 绝对可行^_^
      

  10.   

    --建立测试数据
    create table t1
    (id int identity(1,1),aaa varchar(1000))
    --插入数据
    insert into t1
    select 'a1,a2' union all
    select 'a2,a4' union all
    select 'a8' union all
    select '' union all
    select 'a9,a1'--方法一
    DECLARE  @S AS VARCHAR(8000)
    SET @S=''
    SELECT @S=@S+'UNION ALL SELECT '''+REPLACE(aaa,',',''' AS _COLUMN UNION ALL SELECT ''')+''' AS _COLUMN  '
    FROM t1 WHERE aaa<>''
    SET @S=' SELECT DISTINCT _COLUMN AS _COUNT FROM ('+STUFF(@S,1,10,'')+' ) TB  '
    EXEC(@S)
    --方法二
    SELECT TOP 8000 
        id = IDENTITY(int, 1, 1) 
    INTO # 
    FROM syscolumns a, syscolumns b
    SELECT 
       DISTINCT  姓名=SUBSTRING(A.[aaa], B.id, CHARINDEX(',', A.[aaa] + ',', B.id) - B.id)
    FROM t1 A, # B
    WHERE SUBSTRING(',' + A.[aaa], B.id, 1) = ',' and aaa<>''
    --方法三(SQL SERVER 2005)
    SELECT 
       B.keyword
    FROM(
        SELECT id, [aaa] = CONVERT(xml,
                '<root><v>' + REPLACE([aaa], ',', '</v><v>') + '</v></root>')
        FROM TB WHERE aaa<>''
    )A
    OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)')
        FROM A.[aaa].nodes('/root/v') N(v)
    )B
    --结果
    /*
    _COUNT 
    ------ 
    a1
    a2
    a4
    a8
    a9
    */
    --删除测试环境
    drop table t1
    drop table #
      

  11.   

    给你个参照.以前贴子if exists(Select name From sysobjects where [Name]='AA')
     Drop table AAcreate TABLE AA(id int,title nvarchar(100))
    Insert AA values(3456,'601988,600028,HK3988,HK0386')
    Insert AA values(3457,'601988,600028')-- 生成只有一列且自动递增临时表
    select top 8000 id=IDENTITY(int,1,1)
    into #T FROM syscolumns a,syscolumns bSelect * From #TSELECT 
        AA.ID,  title=SUBSTRING(AA.title, #T.ID, CHARINDEX(',', AA.title + ',', #T.ID) - #T.ID) 
    FROM AA, #T
    WHERE SUBSTRING(',' + AA.title, #T.id, 1) = ','   
    ORDER BY 1,2
    Drop table AA
    Drop Table #T
      

  12.   

    补上;
    对上个查询结果进行Select distinct title From (上查询结果)  即可
      

  13.   

    如果楼主是出于提高效率的考虑,就没有必要还在想怎么写Sql语句..放在前台内存中来进行处理,(即代码中)效率要高得多..不妨自己做个测试..