在 INNER JOIN 的一部分中使用 LIKE 子句
-
09-06-2019 - |
题
在构建存储过程/查询时,我可以/应该使用 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”术语。
我的印象是,根据性能,我可以使用指定的查询或使用全文关键字搜索来完成相同的任务?
除了让服务器对我想要文本搜索的字段进行文本索引之外,我还需要做什么吗?
解决方案
您的第一个查询将起作用,但需要全表扫描,因为该列上的任何索引都将被忽略。您还必须执行一些动态 SQL 来生成所有 LIKE 子句。
如果您使用 SQL Server,请尝试全文搜索,或者查看其中之一 卢塞恩 实施。乔尔最近谈到了他的成功。
其他提示
尝试这个
select * from Table_1 a
left join Table_2 b on b.type LIKE '%' + a.type + '%'
这种做法并不理想。谨慎使用。
您似乎正在寻找全文搜索。因为您想根据卡片描述查询一组关键字并找到任何匹配项?正确的?
就我个人而言,我以前曾经这样做过,而且对我来说效果很好。我能看到的唯一问题可能是未索引列的问题,但我认为使用 where 子句也会遇到同样的问题。
我给你的建议是看看两者之间的执行计划。我确信哪一个更好会根据具体情况而有所不同,就像所有好的编程问题一样。
@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)
这将使您可以使用索引,而无需实施附加解决方案,并保持数据原子性。
有关的: 推荐用于标记或标记的 SQL 数据库设计
我在存储过程中进行“强烈键入”列表进行的一个技巧是将列表解析到表变量/临时表中
我认为您可能在这里提到的是将要包含的关键字放入表中,然后使用 关系划分 查找匹配项(也可以使用另一个表来排除要排除的单词)。有关 SQL 中的有效示例,请参阅 Joe Celko 的关键字搜索.
尝试一下...
select * from table11 a inner join table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'.
它对我有用。:-)
性能将取决于您使用的实际服务器、数据架构以及数据量。对于当前版本的 MS SQL Server,该查询应该运行得很好(MS SQL Server 7.0 的语法存在问题,但是 它已在 SP2 中得到解决).
您是否通过分析器运行过该代码?如果性能足够快并且数据具有适当的索引,那么您应该已准备就绪。
LIKE '%fiend%' 永远不会使用搜索,而 LIKE 'fiend%' 会。简单的通配符搜索是不可控制的
尝试这个;
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' +
CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%'