在构建存储过程/查询时,是否可以/应该使用LIKE条件作为INNER JOIN的一部分?我不确定我问的是正确的,所以让我解释一下。
我正在创建一个过程,该过程将在包含文本的列中搜索要搜索的关键字列表。如果我坐在控制台上,我会按原样执行:
SELECT Id, Name, Description
FROM dbo.Card
WHERE Description LIKE '%warrior%'
OR
Description LIKE '%fiend%'
OR
Description LIKE '%damage%'
但是我拿起一些技巧去做一个存储过程中的“强类型”列表解析就是将列表解析成表变量/临时表,将其转换为正确的类型然后进行INNER JOIN在我的最终结果集中反对该表。当向程序发送整数ID列表时,这很有用。我最后得到一个如下所示的最终查询:
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId
我想将此技巧与字符串列表一起使用。但是因为我正在寻找一个特定的关键字,所以我将使用LIKE子句。理想情况下,我认为我的最终查询看起来像这样:
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'
这可能/推荐吗?
有没有更好的方法来做这样的事情?
我在条款的两端加上通配符的原因是因为卡片文本中使用了“archfiend”,“beast-warrior”,“direct-damage”和“battle-damage”术语。
我的印象是,根据性能,我可以使用我指定的查询,还是使用全文关键字搜索来完成相同的任务?
除了让服务器对我想要文本搜索的字段做文本索引外,还有什么我需要做的吗?
答案 0 :(得分:5)
您的第一个查询将起作用,但需要进行全表扫描,因为该列上的任何索引都将被忽略。您还必须执行一些动态SQL来生成所有LIKE子句。
如果您使用的是SQL Server,请尝试全文搜索,或查看其中一个Lucene实施。乔尔最近谈到了他的成功。
答案 1 :(得分:5)
试试这个
select * from Table_1 a
left join Table_2 b on b.type LIKE '%' + a.type + '%'
这种做法并不理想。请谨慎使用。
答案 2 :(得分:1)
好像您正在寻找全文搜索。因为您想根据卡片描述查询一组关键字并找到任何匹配?正确的吗?
答案 3 :(得分:1)
就个人而言,我以前做过,而且对我来说效果很好。我可以看到的唯一问题可能是未索引列的问题,但我认为你对where子句会有同样的问题。
我给你的建议只是看看两者之间的执行计划。我确信根据情况会有哪一个更好,就像所有好的编程问题一样。
答案 4 :(得分:1)
@ Dillie-O
这张桌子有多大?
描述字段的数据类型是什么?
如果其中一个很小,则全文搜索将会过度。
@ Dillie-O
也许不是你寻找的答案,但我会提倡架构改变......
提出的架构:
create table name(
nameID identity / int
,name varchar(50))
create table description(
descID identity / int
,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values
create table nameDescJunc(
nameID int
,descID int)
这将允许您使用索引而无需在解决方案上实现螺栓,并使您的数据保持原子。
答案 5 :(得分:1)
我抓起来的一个技巧 做“强类型”列表解析 一个存储过程就是解析 列表变量/临时表 表
我认为你可能在这里提到的是将关键字包含在表中,然后使用relational division来查找匹配项(也可以使用另一个表来排除单词)。有关SQL中的工作示例,请参阅Keyword Searches by Joe Celko。
答案 6 :(得分:1)
尝试一下......
select * from table11 a inner join table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'.
它适用于我。: - )
答案 7 :(得分:0)
性能取决于您使用的实际服务器,以及数据架构和数据量。使用当前版本的MS SQL Server,该查询应该运行正常(MS SQL Server 7.0存在该语法问题,但it was addressed in SP2)。
您是否通过分析器运行该代码?如果性能足够快并且数据具有适当的索引,则应该全部设置。
答案 8 :(得分:0)
LIKE'%fiend%'永远不会使用搜寻,LIKE'fiend%'会。只是一个通配符搜索不可思议
答案 9 :(得分:0)
试试这个;
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' +
CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%'