2

这是场景。

我在 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 和 4 有一个('Jerry')。)

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

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' > 'Joe' 和 'Brown' > 第一个 'Brown' 匹配。

4

1 回答 1

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
于 2012-08-14T21:54:43.093 回答