У меня есть представление, определенное следующим образом:
CREATE VIEW [dbo].[PossiblyMatchingContracts] AS
SELECT
C.UniqueID,
CC.UniqueID AS PossiblyMatchingContracts
FROM [dbo].AllContracts AS C
INNER JOIN [dbo].AllContracts AS CC
ON C.SecondaryMatchCodeFB = CC.SecondaryMatchCodeFB
OR C.SecondaryMatchCodeLB = CC.SecondaryMatchCodeLB
OR C.SecondaryMatchCodeBB = CC.SecondaryMatchCodeBB
OR C.SecondaryMatchCodeLB = CC.SecondaryMatchCodeBB
OR C.SecondaryMatchCodeBB = CC.SecondaryMatchCodeLB
WHERE C.UniqueID NOT IN
(
SELECT UniqueID FROM [dbo].DefinitiveMatches
)
AND C.AssociatedUser IS NULL
AND C.UniqueID <> CC.UniqueID
Что в основном заключается в поиске контрактов, где f.e. первое имя и день рождения совпадают. Это отлично работает. Теперь я хочу добавить синтетический атрибут к каждой строке со значением только из одной строки источника.
Позвольте мне привести вам пример, чтобы сделать его более ясным. Предположим, что у меня есть следующая таблица:
UniqueID | FirstName | LastName | Birthday
1 | Peter | Smith | 1980-11-04
2 | Peter | Gray | 1980-11-04
3 | Peter | Gray-Smith| 1980-11-04
4 | Frank | May | 1985-06-09
5 | Frank-Paul| May | 1985-06-09
6 | Gina | Ericson | 1950-11-04
Полученный вид должен выглядеть следующим образом:
UniqueID | PossiblyMatchingContracts | SyntheticID
1 | 2 | PeterSmith1980-11-04
1 | 3 | PeterSmith1980-11-04
2 | 1 | PeterSmith1980-11-04
2 | 3 | PeterSmith1980-11-04
3 | 1 | PeterSmith1980-11-04
3 | 2 | PeterSmith1980-11-04
4 | 5 | FrankMay1985-06-09
5 | 4 | FrankMay1985-06-09
6 | NULL | NULL [or] GinaEricson1950-11-04
Обратите внимание, что столбец SyntheticID использует ТОЛЬКО значения из одной из соответствующих строк источника. Неважно, какой из них. Я экспортирую это представление в другое приложение и должен иметь возможность идентифицировать каждую "группу соответствия" впоследствии.
Ясно ли это, что я имею в виду? Любые идеи, как это можно сделать в sql?
Возможно, это помогает немного разобраться в фактическом прецеденте:
Я импортирую контракты из разных систем. Чтобы учесть возможность опечаток или людей, которые вышли замуж, но фамилия была обновлена только в одной системе, мне нужно найти так называемые "возможные совпадения". Два или более контракта считаются возможными, если они содержат один и тот же день рождения плюс одно и то же имя, последнее или имя рождения. Это означает, что если контракт А соответствует контракту В, то договор В также соответствует контракту А.
Целевая система использует многозначные ссылочные атрибуты для хранения этих отношений. Конечной целью является создание пользовательских объектов для этих контрактов. Первый улов состоит в том, что он должен быть только одним пользовательским объектом для нескольких согласующих контрактов. Таким образом, я создаю эти соответствия в представлении. Второй улов заключается в том, что создание пользовательских объектов происходит по рабочим потокам, которые выполняются параллельно для каждого контракта. Чтобы избежать создания нескольких пользовательских объектов для согласования контрактов, каждый рабочий процесс должен проверять, если уже есть соответствующий пользовательский объект или другой рабочий процесс, который собирается создать указанный пользовательский объект. Поскольку механизм рабочего процесса чрезвычайно медленный по сравнению с sql, рабочие процессы не должны повторять весь соответствующий тест. Поэтому идея состоит в том, чтобы позволить рабочему процессу проверять только "синтетический идентификатор".