To find rows where at least three out of four of those columns match you can use.
SELECT D1.ID, D2.ID
FROM DATA D1
JOIN DATA D2
ON D1.SSN = D2.SSN
AND D1.ID > D2.ID
AND 2 <= CASE
WHEN D1.FNAME = D2.FNAME THEN 1
ELSE 0
END +
CASE
WHEN D1.LNAME = D2.LNAME THEN 1
ELSE 0
END +
CASE
WHEN D1.DOB = D2.DOB THEN 1
ELSE 0
END
UNION ALL
SELECT D1.ID, D2.ID
FROM DATA D1
JOIN DATA D2
ON D1.DOB = D2.DOB
AND D1.FNAME = D2.FNAME
AND D1.LNAME = D2.LNAME
AND D1.SSN <> D2.SSN
AND D1.ID > D2.ID
The top branch gets all rows where the SSN
are the same and at least 2 out of the three other columns are the same. The join on SSN
is likely to be pretty selective in itself.
That just leaves one other possible three column combination left which is dealt with by the second branch.
Both branches of the UNION ALL
have an equi join so it should perform better than a join with some complicated OR
condition.