优化sql语句
数据库里有两张表a ,b
a 里有一字段 b_list 里面存储着表b的很多id,id之间用逗号隔开的,
如数据
表a
id b_list
1 ,1,2,3,4,5,6
2 ,5,6,7,8,9
表b
id
1
2
3
4
5
6
现在我想跟据b_list里的内容直接查出b表里对应的信息
我不想把b_list的内容拆开,再每个id查找对应b表里的id,如果数据一多,速度就慢很多,能否有好的方法提高速度(在不改变数据库表结构的前提)
问题点数:60、回复次数:7Top
1 楼vivianfdlpw()回复于 2005-08-22 12:42:22 得分 5
select * from b where charindex(','+convert(varchar,id)+',',@b_list+',')>0Top
2 楼wgsasd311(自强不息)回复于 2005-08-22 12:52:54 得分 5
select a.id,(select [你要查的字段] from tbb where id in( a.b_list ) from tba aTop
3 楼xluzhong(Ralph)回复于 2005-08-22 12:54:16 得分 5
select *
from b
inner join a
on len(a.b_list) - len(replace(','+b.id+',',','+a.b_list+',','')) > 0
Top
4 楼gimy007(逮猫的耗子)回复于 2005-08-22 12:55:28 得分 5
create function reS(int @a)
return varchar(1000)
as
declare @s varchar(1000)
select @s=b_list from a where [id]=@a
set @s=@s+','
return @s
select b.* from b,a where charindex(','+convert(varchar,id)+',',dbo.reS(a.id)>0
根据vivianfdlpw() 想的,没测试,楼主看看
Top
5 楼filebat(Mark)回复于 2005-08-22 13:06:04 得分 35
create table ta(id int, b_list varchar(40))
create table tb(id int, value varchar(10))
go
insert ta select 1, ',1,2,3,4,5,6' union all select 2, ',5,6,7,8,9'
insert tb select 1, 'a' union all select 2, 'b' union all select 3, 'c'
insert tb select 4, 'd' union all select 5, 'e' union all select 6, 'f'
insert tb select 7, 'g' union all select 8, 'h' union all select 9, 'i'
go
--主要部分
create function fun(@b_list varchar(40))
returns varchar(100)
as
begin
declare @str varchar(100)
set @str=@b_list+','
select @str=replace(@str, ','+convert(varchar(10), id)+',', ','+value+',')
from tb
set @str=left(@str, len(@str)-1)
return @str
end
go
select id, b_list=dbo.fun(b_list) from ta
--清除
drop function fun
drop table ta
drop table tbTop
6 楼wgsasd311(自强不息)回复于 2005-08-22 13:27:08 得分 0
上面写错了少了一括号
select a.id,(select [你要查的字段] from tbb where id in( a.b_list )) from tba a
Top
7 楼tuwicn(木狼)回复于 2005-08-22 13:48:59 得分 5
--例子:
--查出ta表中id为2的b_list对应的tb表数据:
select value from tb,ta where charindex(convert(varchar(5),tb.id),b_list)<>0 and ta.id=2Top




