+ -
当前位置:首页 → 问答吧 → 请教关于sqlserver2008复杂的效度和重复性检索,具体描述见问题题干

请教关于sqlserver2008复杂的效度和重复性检索,具体描述见问题题干

时间:2011-12-03

来源:互联网

大家好:

  最近的项目需要做一种类似效度的检索功能,例如有一个表t1,其中唯一字段为docid,
  每次检索该表完成后得到一个该docid的字符串,
   
  如: 1,5,7,11,23,45,123,333,555,789 这种格式,用 , 分割了
  第二次检索:5,11,245,23,21,45,333,888
  第三次减速:15,111,1245,123,121,45,1333,888
  ...
  第 n次检索:11,555,333,45,222,999

  这些数据用上面的格式存储在表 t2 的字段 smark中

  现在希望每次检索的时候,在原有的条件基础上增加一个效度参数,能够实现如下效果:
 
  传入参数:效度值 v,比如 v = 3,
  那么以后从表 t1中检索出数据,要求 t1 的字段docid 在表t2的字段 smark 中出现的次数要小于 v = 3 次
  如果对照上面的例子,那么 333(出现3次) 和 45(出现4次)就不能再被检索到

  其中 v 可变,v>=1

谢谢

作者: chilli6519   发布时间: 2011-12-03

declare @v int
set @v = 3

select * from t1 a
where ... --其他条件
and isnull((select count(*) from t1
where ',' + smark + ',' like '%,' + cast(a.docid as varchar(20)) + ',%'
),0)<@v


关键效率很差,设计问题引起的

作者: Haiwer   发布时间: 2011-12-03

SQL code
select * from t1 
 where (select count(*) from t2 where ','+docid+',' like ','+rtrim(t1.docid)+',')<=3

作者: ssp2009   发布时间: 2011-12-03

SQL code

declare v int
select * from t1 
 where (select count(*) from t2 where ','+smark+',' like ','+rtrim(t1.docid)+',')<=v

作者: ssp2009   发布时间: 2011-12-03

谢谢,关于效率,请问如何设计能够提高,万分感谢答复和提供解决方案,因为现在项目目前还没有最终定型,可以调整数据的设计

关键效率很差,……

引用 1 楼 haiwer 的回复:

declare @v int
set @v = 3

select * from t1 a
where ... --其他条件
and isnull((select count(*) from t1
where ',' + smark + ',' like '%,' + cast(a.docid as varchar(20)) + ',%'
),0)<@v


作者: chilli6519   发布时间: 2011-12-03

设计成这样

第二次检索 5
第二次检索 11
第二次检索 。。。

不要用拆分的

作者: fredrickhu   发布时间: 2011-12-03

或者几表存

一表存检索次数 一表存docid

作者: fredrickhu   发布时间: 2011-12-03

热门下载

更多