2008-08-21 175 views
10

构建存储过程/查询时,我可以/应该使用LIKE标准作为INNER JOIN的一部分吗?我不确定我在问正确的事情,所以让我解释一下。在INNER JOIN中使用LIKE子句

我正在创建一个程序,该程序将在包含文本的列中搜索要搜索的关键字列表。如果我坐在控制台前,我会执行它是这样:

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”,“兽战士”,“直接损害”,并且在使用“战斗伤害”条款卡片文本。

我得到的印象是,根据性能,我可以使用我指定的查询或使用全文关键字搜索来完成相同的任务?

除了让服务器对字段进行文本索引我想要进行文本搜索之外,还有什么我需要做的吗?

回答

4

您的第一个查询将起作用,但将需要全表扫描,因为该列上的任何索引都将被忽略。您还必须执行一些动态SQL来生成所有LIKE子句。

如果您使用SQL Server或检出其中一个Lucene实现,请尝试全文搜索。 Joel最近谈到了他的成功。

1

看来你正在寻找全文搜索。因为您想根据卡片说明查询一组关键字并查找任何匹配吗?正确?

1

就我个人而言,我已经做到了,它对我来说工作得很好。我可以看到的唯一问题可能是无索引列的问题,但我认为你会遇到与where子句相同的问题。

我对你的建议只是看两者之间的执行计划。我相信,就像所有好的编程问题一样,这取决于具体情况会有所不同。

0

性能将取决于您使用的实际服务器以及数据架构和数据量。使用当前版本的MS SQL Server,该查询应该可以正常运行(MS SQL Server 7.0具有该语法的问题,但是it was addressed in SP2)。

你是否通过探查器运行该代码?如果性能足够快并且数据具有适当的索引,则应该全部设置。

0

LIKE'%fiend%'永远不会使用seek,LIKE'fiend%'会。只是一个通配符搜索是不可靠的

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) 

这将让你使用索引的,而不具有在解决方案上实施螺栓,并保持您的数据原子。

相关:Recommended SQL database design for tags or tagging

1

一招我拿起一小会儿去 做“强类型”列表分析中 存储过程是解析 列表到一个表变量/临时 表

我想你可能会在这里暗指是把关键字加入到一个表,然后使用relational division找到匹配(也可以使用其他表的话排除)。有关SQL中的工作示例,请参阅Keyword Searches by Joe Celko

0

试试这个;

SELECT Id, Name, Description 
FROM dbo.Card 
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
           CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%' 
3

试试这个

select * from Table_1 a 
    left join Table_2 b on b.type LIKE '%' + a.type + '%' 

这种做法是不理想的。谨慎使用。

+2

我想这应该是'CONCAT( '%',a.type, '%')`HTTP: //stackoverflow.com/a/23276513/443900 – Lee 2016-12-07 21:07:51

0

尝试...

select * from table11 a inner join table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'. 

其作品对我来说:-)