我有一个SQL查询,它返回表1中的所有记录,其中字段中的一个完整单词与表2中的字段名称匹配。例如,如果我在表2中有一个名为“brown”的字段,则为字段名称在结果中会返回“快速棕色狐狸”的表格1,但字段名称“thequickbrownfox”不会,因为它不是一个单词字段名称。
select distinct [SpecNumber], [SpecName], sc.[SpecCrosscheckName] from [SpecSummary] ss
INNER JOIN [SpecCrosscheck] sc
on ss.[SpecName] = sc.[SpecCrosscheckName] or
ss.[SpecName] like '% ' + sc.[SpecCrosscheckName] + ' %' or
ss.[SpecName] like '% ' + sc.[SpecCrosscheckName] or
ss.[SpecName] like sc.[SpecCrosscheckName] + ' %'
order by sc.[SpecCrosscheckName]
这会按预期返回结果,但内部联接是复杂的,因此需要花费3分钟才能运行。是否有更有效的方法来获得相同的结果?据我所知,没有办法将类似的声明合并为一个,我不相信这会改善性能。
我已经研究过使用CONTAINS
,但我不相信字段名称可以用作此功能的搜索条件?
额外信息: SpecCrosscheck只包含一个字段,一个单词名称列表(“James”,“Boris”等)。 SpecSummary中的“SpecName”字段包含全名(例如“David James”,“Joe Bloggs”)。我想在SpecSummary中返回所有结果,其中全名中的一个单词与SpecCrosscheckName中任何记录的相同匹配(因此,对于上面的示例,“David James”将被返回,但“Joe Bloggs”将不会返回。
答案 0 :(得分:0)
此:
ss.[SpecName] like '%' + sc.[SpecCrosscheckName] + '%'
与其他所有组合相同,所以就是这个。
编辑:没有发现空格,我的不好。答案 1 :(得分:0)
我认为你可以通过删除单词之间的空格来比较列,所以如果我是对的,你可以通过REPLACE函数实现如下:
REPLACE(ss.[SpecName], ' ', '') = REPLACE(sc.[SpecCrosscheckName], ' ', '')
或者,你可以使用下面的部分比较
REPLACE(ss.[SpecName], ' ', '') LIKE '%' + REPLACE(sc.[SpecCrosscheckName], ' ', '') + '%'
完整查询将如下:
SELECT DISTINCT [SpecNumber], [SpecName], sc.[SpecCrosscheckName]
FROM [SpecSummary] ss
INNER JOIN [SpecCrosscheck] sc
ON REPLACE(ss.[SpecName], ' ', '') LIKE '%' + REPLACE(sc.[SpecCrosscheckName], ' ', '') + '%'
ORDER BY sc.[SpecCrosscheckName]
答案 2 :(得分:0)
尝试添加前导和尾随空格
select distinct [SpecNumber], [SpecName], sc.[SpecCrosscheckName] from [SpecSummary] ss
INNER JOIN [SpecCrosscheck] sc
on ' '+ ss.[SpecName] +' ' like '% ' + sc.[SpecCrosscheckName] + ' %'
order by sc.[SpecCrosscheckName]
尽管这可以按预期工作,但原始查询会运行得更快!
答案 3 :(得分:0)
尝试使用以下脚本。
select distinct [SpecNumber], [SpecName], sc.[SpecCrosscheckName] from [SpecSummary] ss
INNER JOIN [SpecCrosscheck] sc
on LTRIM(RTRIM(ss.[SpecName])) like '%' +sc.[SpecCrosscheckName]+ '%'
order by sc.[SpecCrosscheckName]