2014-10-08 50 views
1

我對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的左後車輪輪輻從頭TblPostBuildData的裂開的車輪輪輻,因爲他們兩人都字輪。我不想指定希望查詢匹配相似度的輪子的關鍵字。

這可能嗎?感謝您的期待。

+0

這在SQL中不太受支持。如果你嘗試這樣做,那麼表現將會非常糟糕。另外,他們爲什麼不匹配「SPOKE」這個詞? – 2014-10-08 14:28:17

+0

是的,他們可以匹配這個詞也說,在我的例子中略有疏忽。它也會在Tire上匹配。雖然不容易支持,但是可以用小桌子嗎? – Palendrone 2014-10-08 14:29:38

+1

你在使用什麼數據庫? – 2014-10-08 14:32:31

回答

0

假設你有一個函數,它接受一個行並返回一個包含所有單個單詞表,你可以使用的EXISTS組合(msdn.microsoft.com)和INTERSECT(msdn.microsoft.com),看是否有詞匹配。

如果您在互聯網上搜索(例如SQL UDF split words and return to table),您可以找到這種功能。

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,OUTER APPLY和FUNCTION。

相關問題