日期:2014-05-20  浏览次数:20859 次

找牛人写条SQL查询语句
表   t1,有个字段aaa
ID       aaa
1         a1,a2
2         a2,a4
3         a8
4        
5         a9,a1

需得到结果:
a1
a2
a4
a8
a9
若能按出现的次数排序就更完美了
先谢谢!  



------解决方案--------------------
在程序中控制吧,不要把太多逻辑控制放到SQL语句中,况且这种东西好像不太好搞
------解决方案--------------------
一条sql语句搞不定,可能要考虑用到存储过程或者在程序里面控制
------解决方案--------------------
绝对支持在前台处理
后台要对字符串处理很麻烦。其他没有什么,
也就是创建一个临时表,储存两个字段,一个是a1.a4.a8这样的内容,一个放次数。
然后用order by很容易就排出你想要的顺序。

sql的帮助找一下字符处理就可以做出来了,不难的。

------解决方案--------------------
在前台处理显然要比在数据库中直接操作效率要高得多啊..
------解决方案--------------------
暂同wangkun9999的说法
------解决方案--------------------
很显然,要使用类似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

*/
------解决方案--------------------
什么需求要求要有这样的数据库结构啊???
我觉得有百分之九十的可能是数据库设计不合理,要么就用XML字段得了,要么牺牲一点冗余吧!这样放在一个字段里,都不能看作一个集合,也用不了IN运算...
------解决方案--------------------
为什么不用dataview去实现??
------解决方案--------------------
select aaa from t1 group by aaa
------解决方案--------------------
这个需求不合理

强烈要求换修改数据库

^_^
------解决方案--------------------
如果要获得最高的效率建议重新设计数据库
这个应该属于没有消除传递依赖。
------解决方案--------------------
应该在后台处理.建个辅助表,一句可以搞定.
------解决方案--------------------
Select convert(char(2),aaa ) form t1 order by convert(char(2),aaa )

若都为两位 绝对可行^_^
------解决方案--------------------