Вы определенно хотите взвесить разные спички. Если SSN совпадает, это довольно хороший показатель. Если firstName совпадает, это в принципе ничего не стоит.
Вы можете попробовать метод оценки, основанный на весах совпадений, в сочетании с алгоритмами сопоставления фонетических строк, с которыми вы связались. Вот пример, который я описал в T-SQL. Это должно быть перенесено в Oracle для вашей проблемы.
--Score Threshold to be returned
DECLARE @Threshold DECIMAL(5,5) = 0.60
--Weights to apply to each column match (0.00 - 1.00)
DECLARE @Weight_FirstName DECIMAL(5,5) = 0.10
DECLARE @Weight_LastName DECIMAL(5,5) = 0.40
DECLARE @Weight_SSN DECIMAL(5,5) = 0.40
DECLARE @Weight_Gender DECIMAL(5,5) = 0.10
DECLARE @NewStuff TABLE (ID INT IDENTITY PRIMARY KEY, FirstName VARCHAR(MAX), LastName VARCHAR(MAX), SSN VARCHAR(11), Gender VARCHAR(1))
INSERT INTO @NewStuff
( FirstName, LastName, SSN, Gender )
VALUES
( 'Ben','Sanders','234-62-3442','M' )
DECLARE @OldStuff TABLE (ID INT IDENTITY PRIMARY KEY, FirstName VARCHAR(MAX), LastName VARCHAR(MAX), SSN VARCHAR(11), Gender VARCHAR(1))
INSERT INTO @OldStuff
( FirstName, LastName, SSN, Gender )
VALUES
( 'Ben','Stickler','234-62-3442','M' ), --3/4 Match
( 'Albert','Sanders','523-42-3441','M' ), --2/4 Match
( 'Benne','Sanders','234-53-2334','F' ), --2/4 Match
( 'Ben','Sanders','234623442','M' ), --SSN has no dashes
( 'Ben','Sanders','234-62-3442','M' ) --perfect match
SELECT
'NewID' = ns.ID,
'OldID' = os.ID,
'Weighted Score' =
(CASE WHEN ns.FirstName = os.FirstName THEN @Weight_FirstName ELSE 0 END)
+
(CASE WHEN ns.LastName = os.LastName THEN @Weight_LastName ELSE 0 END)
+
(CASE WHEN ns.SSN = os.SSN THEN @Weight_SSN ELSE 0 END)
+
(CASE WHEN ns.Gender = os.Gender THEN @Weight_Gender ELSE 0 END)
,
'RAW Score' = CAST(
((CASE WHEN ns.FirstName = os.FirstName THEN 1 ELSE 0 END)
+
(CASE WHEN ns.LastName = os.LastName THEN 1 ELSE 0 END)
+
(CASE WHEN ns.SSN = os.SSN THEN 1 ELSE 0 END)
+
(CASE WHEN ns.Gender = os.Gender THEN 1 ELSE 0 END) ) AS varchar(MAX))
+
' / 4',
os.FirstName ,
os.LastName ,
os.SSN ,
os.Gender
FROM @NewStuff ns
--make sure that at least one item matches exactly
INNER JOIN @OldStuff os ON
os.FirstName = ns.FirstName OR
os.LastName = ns.LastName OR
os.SSN = ns.SSN OR
os.Gender = ns.Gender
where
(CASE WHEN ns.FirstName = os.FirstName THEN @Weight_FirstName ELSE 0 END)
+
(CASE WHEN ns.LastName = os.LastName THEN @Weight_LastName ELSE 0 END)
+
(CASE WHEN ns.SSN = os.SSN THEN @Weight_SSN ELSE 0 END)
+
(CASE WHEN ns.Gender = os.Gender THEN @Weight_Gender ELSE 0 END)
>= @Threshold
ORDER BY ns.ID, 'Weighted Score' DESC
А затем вот вывод.
NewID OldID Weighted Raw First Last SSN Gender
1 5 1.00000 4 / 4 Ben Sanders 234-62-3442 M
1 1 0.60000 3 / 4 Ben Stickler 234-62-3442 M
1 4 0.60000 3 / 4 Ben Sanders 234623442 M
Затем вам нужно будет выполнить некоторую постобработку, чтобы оценить достоверность каждого возможного совпадения. Если вы когда-нибудь получите 1,00 за взвешенный счет, вы можете предположить, что это правильный матч, если только вы не получите два из них. Если вы получите фамилию и SSN (общий вес 0,8 в моем примере), вы можете быть достаточно уверены, что это правильно.