Join 如何将两组标记化数据进行自连接以指示匹配频率

Join 如何将两组标记化数据进行自连接以指示匹配频率,join,sql-server-2008-r2,Join,Sql Server 2008 R2,下面是一个场景 我在SQL Server 2008 R2表中有两条记录,如下所示: ID Name 1 Joe Stephen Brown 2 Joe Henry Wallace Brown 3 Jerry Joe Carr 4 Jerry Lewis 我已经

下面是一个场景

我在SQL Server 2008 R2表中有两条记录,如下所示:

ID                    Name
1                     Joe Stephen Brown     
2                     Joe Henry Wallace Brown     
3                     Jerry Joe Carr     
4                     Jerry Lewis     
我已经标记了name列,并将其与令牌关联的id一起放入令牌表中,因此我们现在有了以下内容:

ID                    Token
1                     Joe
1                     Stephen
1                     Brown
2                     Joe
2                     Henry
2                     Wallace
2                     Brown
3                     Jerry
3                     Joe
3                     Carr
4                     Jerry
4                     Lewis
我希望能够在此表上进行自联接,以便计算自联接中一个表的令牌与自联接中另一个表的令牌匹配的次数。所以比赛应该是这样的:

Table1.ID             Table1.Token          Table2.ID             Table2.Token
1                     Joe                   2                     Joe
1                     Brown                 2                     Brown
1                     Joe                   3                     Joe
3                     Jerry                 4                     Jerry
Table1.ID             Table2.ID             Number of matches
1                     2                     2
1                     3                     1
3                     4                     1
ID                    Name
1                     Joe Stephen Brown     
2                     Joe Henry Brown Brown     
在记录1和记录2上有两个象征性的匹配“乔”和“布朗”,在记录1和记录3上有一个“乔”,在记录3和记录4上有一个“杰里”

因此,我希望比赛的最终报告如下:

Table1.ID             Table1.Token          Table2.ID             Table2.Token
1                     Joe                   2                     Joe
1                     Brown                 2                     Brown
1                     Joe                   3                     Joe
3                     Jerry                 4                     Jerry
Table1.ID             Table2.ID             Number of matches
1                     2                     2
1                     3                     1
3                     4                     1
ID                    Name
1                     Joe Stephen Brown     
2                     Joe Henry Brown Brown     
然而,我对如何做到这一点感到困惑。我曾想过单独对令牌进行自连接,但如果令牌表中有其他带有“Joe”和“Brown”的记录,则会变得复杂

编辑

如果有这样的情况:

Table1.ID             Table1.Token          Table2.ID             Table2.Token
1                     Joe                   2                     Joe
1                     Brown                 2                     Brown
1                     Joe                   3                     Joe
3                     Jerry                 4                     Jerry
Table1.ID             Table2.ID             Number of matches
1                     2                     2
1                     3                     1
3                     4                     1
ID                    Name
1                     Joe Stephen Brown     
2                     Joe Henry Brown Brown     

如果可能的话,我希望匹配计数为2;换言之,《乔·斯蒂芬·布朗》中的“布朗”应该与《乔·亨利·布朗》中的第一个“布朗”相匹配,而《乔·亨利·布朗》中的第二个“布朗”应该是无与伦比的。然后“Joe”>“Joe”和“Brown”>第一个“Brown”匹配项都应该被计算。

因此,如果我理解这些要求,我相信这个查询应该给出预期的结果:

;WITH DistinctTokens AS (
    SELECT DISTINCT ID, Name
    FROM Tokens
)
SELECT
    t1.ID AS [Table1.ID],
    t1.Token AS [Table1.Token],
    t2.ID AS [Table2.ID],
    t2.Token AS [Table2.Token]
FROM
    DistinctTokens t1 FULL OUTER JOIN
    DistinctTokens t2 ON t1.Token = t2.Token AND t1.ID < t2.ID
编辑:

好的,谢谢你的澄清;离这儿近吗

SELECT
    t1.ID AS [Table1.ID],
    t2.ID AS [Table2.ID],
    COUNT(*) AS [Number of matches]
FROM
    Tokens t1 JOIN
    Tokens t2 ON t1.Token = t2.Token AND t1.ID < t2.ID
GROUP BY
    t1.ID,
    t2.ID

如果有两个以上相同值的令牌,您能否提供一个预期结果的示例?我不确定您是否只想要一个代币计数,或者您是否希望看到每个代币的笛卡尔积与所有其他具有相同价值的代币连接……我已经添加了澄清,@michael-frederickson.Thank@迈克尔·弗雷德里克森,但这不是我想要的答案。我可以看出,我给出的示例显示匹配是令人困惑的,而且我给出的示例太简单,无法充分解释我试图实现的目标。我再次编辑了原始问题,使其更清楚我想要什么。