关于过滤多个关键词的查询是否可以优化。

Wall_E 2010-07-21 10:56:16
有两个表:
一个是正文
一个是关键词

想通过获得所有包含任意一个关键词的正文

目前采用的是拼接SQL条件的方法,脚本如下:

-- 文本表
CREATE TABLE TextTable (Title nvarchar(256))
INSERT INTO TextTable VALUES('【如何更有效地在SQL Server论坛上提问】')
INSERT INTO TextTable VALUES('【版务贴】关于[MS-SQL Server]→[基础类]版强制结贴的说明')
INSERT INTO TextTable VALUES('请问数据库支持加密吗?')
INSERT INTO TextTable VALUES('一直没搞明白这个问题')
INSERT INTO TextTable VALUES('提升SQL Server程序员工作效率的几个技巧')
INSERT INTO TextTable VALUES('SQLServer 中文处理')
INSERT INTO TextTable VALUES('跪求sql')
INSERT INTO TextTable VALUES('请教:一个简单的SQL子查询问题')
INSERT INTO TextTable VALUES('公司让看一个数据库,请问该怎么看?')
INSERT INTO TextTable VALUES('sql做表问题')
INSERT INTO TextTable VALUES('sql2000服务器网络实用工具启动不了')
INSERT INTO TextTable VALUES('谁有大数据量的数据库,可以给我一个吗')
INSERT INTO TextTable VALUES('sql server 2000数据库选项的作用是什么?')
INSERT INTO TextTable VALUES('我从不同的表中提取想要的数据为一视图,显示在页面上,我需要一个ID.')
INSERT INTO TextTable VALUES('在线等多条件查询优化语句')
INSERT INTO TextTable VALUES('触发器一会能触发一会不能触发 求助。。在线等')
INSERT INTO TextTable VALUES('SQL Server 查询分析器提供的所有键盘快捷方式(转)')
INSERT INTO TextTable VALUES('用SQL语句进行数据库的备份和恢复~~求教')
INSERT INTO TextTable VALUES('高手来教下怎么用2005呀')
INSERT INTO TextTable VALUES('SQL SERVER服务器网络实用工具用不了')
INSERT INTO TextTable VALUES('数据库索引问题')
INSERT INTO TextTable VALUES('如何将一个存储过程赋值给一个临时表??')
INSERT INTO TextTable VALUES('数据表说明')
INSERT INTO TextTable VALUES('Sql2008 附加SQL2000的数据库报错')
INSERT INTO TextTable VALUES('求一条sql语句')
INSERT INTO TextTable VALUES('关于ms-sql查询大小写敏感的问题')
INSERT INTO TextTable VALUES('清华考博试题中出现的奇怪SQL符号,请高人解答')
INSERT INTO TextTable VALUES('sql 2005 收缩方式是不是跟SQL2000 一样')
INSERT INTO TextTable VALUES('SQL查询结果不如意')
INSERT INTO TextTable VALUES('sql server 问题')
INSERT INTO TextTable VALUES('关于词词、成语的拆字搜索(我暂且这么叫,我也不太明白)')
INSERT INTO TextTable VALUES('一个sql查询问题')
INSERT INTO TextTable VALUES('sql达人们,问一个SQL,知道孙子查寻爸爸和爷爷')
INSERT INTO TextTable VALUES('求一个数据转换的查询语句')
INSERT INTO TextTable VALUES('关于SQL的优化请教如果做')
INSERT INTO TextTable VALUES('【版务贴】关于[MS-SQL Server]→[基础类]版强制结贴的说明')
INSERT INTO TextTable VALUES('sql自定义clr函数,怎么链接到上下文中,获取该数据库的数据')
INSERT INTO TextTable VALUES('从DBF中导入数据时,碰到某“不规范”的日期型字段,会中断报错,如:')
INSERT INTO TextTable VALUES('SQL查询')
INSERT INTO TextTable VALUES('求救一个关于MSSQLSERVER的问题 ')
INSERT INTO TextTable VALUES('oracle有类似sql server的事件探查器么?就是程序前台操作所执行的sql都记录下来了。')
INSERT INTO TextTable VALUES('求个SQL语句')
INSERT INTO TextTable VALUES('win7装SQL2005,装成功的进来领分~-~')
INSERT INTO TextTable VALUES('sql 存储过程分页')
INSERT INTO TextTable VALUES('电脑同时安装 SQL Server 2000 和 SQL Server 2005的问题')
INSERT INTO TextTable VALUES('SQL Express 如何将数据同步到SQL Server数据库上?')
INSERT INTO TextTable VALUES('sqlserver 2005 插入表名如何连接两个字符')
INSERT INTO TextTable VALUES('解释一下这条SQL语句 ')
INSERT INTO TextTable VALUES('distinct 用法')
INSERT INTO TextTable VALUES('sql server 2005 两个字符的连接')
INSERT INTO TextTable VALUES('sql server 2005不支持odbc数据源吗')

-- 关键字表
CREATE TABLE KeywordTable(Keyword nvarchar(50))
INSERT INTO KeywordTable VALUES('2005')
INSERT INTO KeywordTable VALUES('触发器')
INSERT INTO KeywordTable VALUES('连接')

DECLARE @SQL nvarchar(MAX)
SET @SQL = 'SELECT Title
FROM TextTable
WHERE 1 = 2'
SELECT @SQL = @SQL + '
OR CHARINDEX(''' + REPLACE(Keyword, '''', '''''') + ''', Title) > 0'
FROM KeywordTable
PRINT @SQL

/* 生成的SQL
SELECT Title
FROM TextTable
WHERE 1 = 2
OR CHARINDEX('2005', Title) > 0
OR CHARINDEX('触发器', Title) > 0
OR CHARINDEX('连接', Title) > 0
*/

EXEC(@SQL)

/*
查询结果:
[Title]
触发器一会能触发一会不能触发 求助。。在线等
高手来教下怎么用2005呀
sql 2005 收缩方式是不是跟SQL2000 一样
win7装SQL2005,装成功的进来领分~-~
电脑同时安装 SQL Server 2000 和 SQL Server 2005的问题
sqlserver 2005 插入表名如何连接两个字符
sql server 2005 两个字符的连接
sql server 2005不支持odbc数据源吗
*/

DROP TABLE TextTable
DROP TABLE KeywordTable


如果关键词上千,记录数上百万,性能会很低。
有没有优化的余地或者更好的写法,谢谢关注。
...全文
313 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
永生天地 2010-07-21
  • 打赏
  • 举报
回复
mark 支持全文索引,虽然不知道效率到底如何
bancxc 2010-07-21
  • 打赏
  • 举报
回复
Mr_Nice 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 htl258 的回复:]

全文索引,参考:http://blog.csdn.net/htl258/archive/2009/04/26/4116721.aspx
[/Quote]

同意,这么多关键词的话,全文索引应该是个不错的办法。
htl258_Tony 2010-07-21
  • 打赏
  • 举报
回复
Wall_E 2010-07-21
  • 打赏
  • 举报
回复
果然杯具了
DECLARE @SQL nvarchar(MAX)

变量的长度只能到4000个字符。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧