在两个表

时间:2016-10-13 11:08:56

标签: sql sql-server

我有一个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”将不会返回。

4 个答案:

答案 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]