我具有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。我不想指定我希望查询匹配相似度的轮的关键字。
这可能吗?谢谢你的期待。
答案 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,'%')