首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

找牛人写条SQL查询语句解决办法

2012-01-15 
找牛人写条SQL查询语句表t1,有个字段aaaIDaaa1a1,a22a2,a43a845a9,a1需得到结果:a1a2a4a8a9若能按出现的次

找牛人写条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 )

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


表设计不合理!
[解决办法]
--建立测试数据
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 #
[解决办法]
给你个参照.以前贴子

if exists(Select name From sysobjects where [Name]= 'AA ')
Drop table AA

create 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 b

Select * From #T

SELECT
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
[解决办法]
如果楼主是出于提高效率的考虑,就没有必要还在想怎么写Sql语句..

放在前台内存中来进行处理,(即代码中)效率要高得多..

不妨自己做个测试..

热点排行