У меня есть база данных SQL Server 2012, которая была импортирована из многозначной среды, что вызывает у меня больше головной боли, чем я хочу сосчитать, однако это то, что есть, и мне приходится с ней работать.
Я пытаюсь создать набор данных, используя эти многозначные записи, но столкнулся с камнем преткновения. Это мой сценарий
У меня есть пользовательский разделитель строки TVF, который разбивает строку «Test, String» на
Rowno | Item
------+---------
1 | Test
2 | String
У меня есть следующие данные:
Таблица клиентов
Ref | Names | Surname | DOB | IdNo
----+-----------+-----------+---------------------+------
123 |John,Sally |Smith | DOB1,DoB2 | 45,56
456 |Dave,Paul |Jones,Dann| DOB1,DOB2 | 98
789 |Mary,Moe,Al|Lee | DOB1 | NULL
Мне нужно создать набор данных, который выглядит следующим образом:
Ref | Names | Surname | DOB | IdNo
----+-----------+-----------+---------------------+------
123 | John | Smith | DOB1 | 45
123 | Sally | Smith | DOB2 | 56
456 | Dave | Jones | DOB1 | 98
456 | Paul | Dann | DOB2 |
789 | Mary | Lee | DOB1 |
789 | Moe | Lee | |
789 | Al | Lee | |
Раньше для решения подобных проблем я решал этот вопрос следующим образом:
SELECT
Ref
, SplitForenames.ITEM names
, SplitSurname.ITEM Surname
, SplitDOB.ITEM dob
, SplitNI.ITEM ID
FROM
Clients
CROSS APPLY
dbo.udf_SplitString(Names, ',') SplitForenames
OUTER APPLY
dbo.udf_SplitString(Surname, ',') SplitSurname
OUTER APPLY
dbo.udf_SplitString(DOB, ',') SplitDOB
OUTER APPLY
dbo.udf_SplitString(ID, ',') SplitNI
WHERE
SplitSurname.RowNo = SplitForenames.RowNo
AND SplitDOB.RowNo = SplitForenames.RowNo
AND SplitNI.RowNo = SplitForenames.RowNo
ORDER BY
REF;
Однако из-за того, что есть примеры различий между количеством фамилий в именах и отсутствующими полями DOB и ID, я не могу сопоставить их таким образом.
Мне нужно сопоставить, где есть совпадение, в противном случае не указывать DOB и ID и использовать первый экземпляр фамилии. Я просто застрял в том, как этого добиться.
У каждого есть какие-либо предложения относительно того, как я могу создать свой требуемый набор данных из исходного источника.
Заранее спасибо