在一个句子中匹配单词的字段上加入表格

时间:2014-10-08 14:24:57

标签: sql sql-server-2008 join

我具有SQL和连接表的基本知识,但是现在我已经遇到了一些相当于我的知识水平的东西。我想加入两个表,其中连接将出现的字段可能有不同的单词,我希望比较两个字段并找到两个字段中特定单词的匹配。


**TblBuildData** 

BuildNo | Defect

123456 | REAR LEFT WHEEL SPOKE SCRATCH

123456 | REAR LEFT TYRE PUNCTURE

**TblPostBuildData**

BuildNo | Defect

123456 | CRACKED WHEEL SPOKE

123456 | MISSING TYRE VALVE

查询会将TblBuildData的REAR LEFT WHEEL SPOKE SCRATCH与TblPostBuildData的CRACKED WHEEL SPOKE相匹配,因为它们都有单词wheel。我不想指定我希望查询匹配相似度的轮的关键字。

这可能吗?谢谢你的期待。

3 个答案:

答案 0 :(得分:0)

假设您有一个占用一行并返回包含所有单个单词的表的函数,您可以使用EXISTS(msdn.microsoft.com)和INTERSECT的组合(msdn.microsoft) .com)看看是否有任何词匹配。

如果您在互联网上搜索,可以找到这种功能(例如SQL UDF split words and return to table)。

答案 1 :(得分:0)

您可以创建拆分功能,将列拆分为多行。我在下面粘贴的内容应该可以在您的数据库上创建一个名为Split的函数。这将是第一个参数的一行,第二个分割的分隔符(在这种情况下我们将使用一个空格),并将返回一个名为items的列的表。

create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX))       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return 
end;

然后你可以组成每个使用外部的2个CTE应用于该功能。该函数返回一个表,该表包含一列,每列对应一行。它将作为项目返回,并连接到表格的每一行,以用于该行的项目中的每个单词。然后只需将这两个CTE连接在项目列中找到的那些单词上。

with tablea as (
    SELECT a.BuildNo, a.Defect, items 
    from TblBuildData a
    outer apply [dbo].[Split](a.Defect, ' ')), 
tableb as (
    SELECT b.BuildNo, b.Defect, items 
    from TblPostBuildData b 
    outer apply [dbo].[Split](b.Defect, ' '))
select t1.BuildNo as BuildNo1, t1.Defect as Defect1, t1.items as Items1, 
       t2.BuildNo as BuildNo2, t2.Defect as Defect2, t2.items as Items2
from tablea t1 
inner join tableb t2 on t1.items=t2.items 

然后从上面的示例中返回3行。一个加入轮子,一个加入轮辐,另一个加入轮胎。

我知道这有点超出了基本的SQL,但这就是我要做的。我建议查看CTE,外部应用和功能。

答案 2 :(得分:0)

尝试一下:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like Concat('%',Table2.Name,'%')