如何自联接两组标记化数据以指示匹配频率

时间:2012-08-14 20:05:53

标签: 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     

我已经将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

(记录1和2上有两个令牌匹配('Joe'和'Brown'),记录1和3上有一个('Joe'),记录3上有一个('Jerry') 4。)

所以我希望比赛的最终报告是这样的:

Table1.ID             Table2.ID             Number of matches
1                     2                     2
1                     3                     1
3                     4                     1

然而,我很难过如何做到这一点。我想过单独使用令牌进行自我加入,但如果令牌表中有其他记录“Joe”和“Brown”,则会变得复杂。

修改

如果有这样的情况:

ID                    Name
1                     Joe Stephen Brown     
2                     Joe Henry Brown Brown     

如果可能,我希望匹配计数为2;换句话说,'Joe Stephen Brown'中的'Brown'应该与'Joe Henry Brown Brown'中的第一个'Brown'匹配,而'Joe Henry Brown Brown'中的第二个'Brown'应该保持无与伦比。然后是'Joe'> '乔'和'布朗'>应首先计算“布朗”比赛。

1 个答案:

答案 0 :(得分:1)

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

;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