按组连接笛卡尔字符串

时间:2018-11-05 16:36:10

标签: sql-server

我正在尝试结合使用Double Metaphone和其他字符串比较功能。 Double Metaphone为您提供每个名称2个编码值。 为此,我采用了全名,并针对名称的每个部分(FirstName,MiddleName等...,LastName)将其拆分为单独的行,并对它们进行了编码。现在,我想将它们重新组合为单个字符串,以进行每种可能的组合,以使用另一个比较功能。

  .Parent.Cut 

我将得到一个像这样的表:

enter image description here

现在,我需要每个DblMetC的笛卡尔积(按原点,namePartId分组)。看起来像:

enter image description here 我如何获得最后一张桌子?

1 个答案:

答案 0 :(得分:1)

根据定义,笛卡尔将意味着您也将具有逆值...

select distinct 
    x.OriginID
    ,x.DblMetC + ' ' + y.DblMetC 
from #MADblMetCombined x
left join #MADblMetCombined y on 
y.NamePartId != x.NamePartId and x.OriginID = y.OriginID

退货

+----------+------------------+
| OriginID | (No column name) |
+----------+------------------+
|        3 | AJNNT AN         |
|        3 | AJNNT JN         |
|        3 | AN AJNNT         |
|        3 | AN FJNNT         |
|        3 | FJNNT AN         |
|        3 | FJNNT JN         |
|        3 | JN AJNNT         |
|        3 | JN FJNNT         |
|       19 | AJNNT AN         |
|       19 | AJNNT ARNKK      |
|       19 | AJNNT FRNKK      |
|       19 | AJNNT JN         |
|       19 | AN AJNNT         |
|       19 | AN ARNKK         |
|       19 | AN FJNNT         |
|       19 | AN FRNKK         |
|       19 | ARNKK AJNNT      |
|       19 | ARNKK AN         |
|       19 | ARNKK FJNNT      |
|       19 | ARNKK JN         |
|       19 | FJNNT AN         |
|       19 | FJNNT ARNKK      |
|       19 | FJNNT FRNKK      |
|       19 | FJNNT JN         |
|       19 | FRNKK AJNNT      |
|       19 | FRNKK AN         |
|       19 | FRNKK FJNNT      |
|       19 | FRNKK JN         |
|       19 | JN AJNNT         |
|       19 | JN ARNKK         |
|       19 | JN FJNNT         |
|       19 | JN FRNKK         |
+----------+------------------+

要获得想要的东西,您需要下面的 ,这不是真正的笛卡尔积:

select
    x.OriginID
    ,coalesce(x.DblMetC + ' ' + y.DblMetC  + ' ' + z.DblMetC,x.DblMetC + ' ' + y.DblMetC,x.DblMetC)
from #MADblMetCombined x
inner join #MADblMetCombined y on 
y.NamePartId = x.NamePartId +1 and x.OriginID = y.OriginID and y.NamePartId = 2
left join #MADblMetCombined z on 
z.NamePartId = x.NamePartId + 2 and z.OriginID = x.OriginID and z.NamePartId = 3