2

これがシナリオです。

SQL Server2008R2テーブルに次の2つのレコードがあります。

ID                    Name
1                     Joe Stephen Brown     
2                     Joe Henry Wallace Brown     
3                     Jerry Joe Carr     
4                     Jerry Lewis     

名前列をトークン化し、トークンが関連付けられている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には2つのトークン一致(「Joe」と「Brown」)があり、レコード1と3には1つ(「Joe」)、レコード3と4には1つ(「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にしたいと思います。つまり、「JoeStephenBrown」の「Brown」は「JoeHenryBrownBrown」の最初の「Brown」と一致し、「JoeHenryBrownBrown」の2番目の「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

編集:

OK、説明してくれてありがとう。これは近いですか?

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 に答える