您可以創建一個拆分功能將列拆分成多行。我在下面粘貼的內容應該可以在數據庫上創建一個名爲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。
這在SQL中不太受支持。如果你嘗試這樣做,那麼表現將會非常糟糕。另外,他們爲什麼不匹配「SPOKE」這個詞? – 2014-10-08 14:28:17
是的,他們可以匹配這個詞也說,在我的例子中略有疏忽。它也會在Tire上匹配。雖然不容易支持,但是可以用小桌子嗎? – Palendrone 2014-10-08 14:29:38
你在使用什麼數據庫? – 2014-10-08 14:32:31