1

问题:

查找 Person 表中名字和姓氏相同或 SSN 相同的匹配记录数。

给定

表结构:

FirstName
LastName
SSN
RecordId

数据:在人员表中

╔═══════════╦══════════╦═════════════╦══════════╗
║ FIRSTNAME ║ LASTNAME ║     SSN     ║ RECORDID ║
╠═══════════╬══════════╬═════════════╬══════════╣
║ Bob       ║ Smith    ║ 111-11-1111 ║        1 ║
║ Robert    ║ Smyth    ║ 111-11-1111 ║        2 ║
║ Bob       ║ Smith    ║ 222-22-2222 ║        3 ║
║ Tom       ║ Gunn     ║ 333-33-3333 ║        4 ║
║ Jim       ║ Gunn     ║ 444-44-4444 ║        5 ║
║ Jimmy     ║ Gunn     ║ 444-44-4444 ║        6 ║
║ Alice     ║ Jones    ║ 555-55-5555 ║        7 ║
║ Alice     ║ Jones    ║ 666-66-6666 ║        8 ║
╚═══════════╩══════════╩═════════════╩══════════╝

期望的结果:

╔════════════╦═══════════╦══════════╦═════════════╦══════════╗
║ MATCHCOUNT ║ FIRSTNAME ║ LASTNAME ║     SSN     ║ RECORDID ║
╠════════════╬═══════════╬══════════╬═════════════╬══════════╣
║          3 ║ Bob       ║ Smith    ║ 111-11-1111 ║        1 ║
║          2 ║ Robert    ║ Smyth    ║ 111-11-1111 ║        2 ║
║          2 ║ Bob       ║ Smith    ║ 222-22-2222 ║        3 ║
║          1 ║ Tom       ║ Gunn     ║ 333-33-3333 ║        4 ║
║          2 ║ Jim       ║ Gunn     ║ 444-44-4444 ║        5 ║
║          2 ║ Jimmy     ║ Gunn     ║ 444-44-4444 ║        6 ║
║          2 ║ Alice     ║ Jones    ║ 555-55-5555 ║        7 ║
║          2 ║ Alice     ║ Jones    ║ 666-66-6666 ║        8 ║
╚════════════╩═══════════╩══════════╩═════════════╩══════════╝

我试过的

我尝试使用 GROUP BY 和 LEFT self JOIN 来解决这个问题。

GROUP BY 失败,因为无法有条件地分组。

LEFT self JOIN 失败,因为它大致返回匹配数的平方。

我会发布我尝试的代码,但我的真实表有大量列,实际上要复杂得多,几乎肯定会掩盖这个问题。

4

1 回答 1

3

既然你还没有提到 RDBMS,试试这个,

SELECT  COUNT(*) MatchCount,a.*
FROM    person a
        INNER JOIN person b
            ON  (a.firstname = b.firstname AND
                    a.lastname = b.lastname) OR
                    a.SSN = b.SSn
GROUP BY firstname, lastname, ssn, recordid
ORDER By recordid

结果

| 比赛计数 | 名字 | 姓氏 | 社会保障号 | 记录 |
-------------------------------------------------- ------------
| 3 | 鲍勃 | 史密斯 | 111-11-1111 | 1 |
| 2 | 罗伯特 | 史密斯 | 111-11-1111 | 2 |
| 2 | 鲍勃 | 史密斯 | 222-22-2222 | 3 |
| 1 | 汤姆 | 冈恩 | 333-33-3333 | 4 |
| 2 | 吉姆 | 冈恩 | 444-44-4444 | 5 |
| 2 | 吉米 | 冈恩 | 444-44-4444 | 6 |
| 2 | 爱丽丝 | 琼斯 | 555-55-5555 | 7 |
| 2 | 爱丽丝 | 琼斯 | 666-66-6666 | 8 |

SQL小提琴

于 2013-01-15T01:12:57.840 回答