SQL Server - написать запрос, который нормализует значения через запятую в плохо построенной схеме - PullRequest
0 голосов
/ 07 сентября 2018

Проблема: я запрашиваю плохо нормализованную базу данных (я не могу сказать о структуре данных и не могу ее изменить)

Имеется следующая база данных:

------------------------------------------
|      Name      |         Codes          |
------------------------------------------
|       Josh     |    A2A-8292            |
-------------------------------------------
|       Adam     |    D2C-1292, B2A-7292  |
-------------------------------------------
|       Jery     |    A2A-1292, F2A-2292, | 
|                |    C2A-2292            |
-------------------------------------------

Как мне написать запрос, который возвращает нормализованную версию, например:

 ------------------------------------------
|      Name      |         Codes          |
------------------------------------------
|       Josh     |    A2A-8292            |
-------------------------------------------
|       Adam     |    D2C-1292            |
-------------------------------------------
|       Adam     |    B2A-7292            |
-------------------------------------------
|       Jery     |    A2A-1292            |
-------------------------------------------
|       Jery     |    F2A-2292            |
-------------------------------------------
|       Jery     |    C2A-2292            |
-------------------------------------------

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Если вы не можете использовать TVF, вот еще один вариант

* ** 1003 тысяча два * Пример
Select A.Name 
      ,B.*
 From  YourTable A
 Cross Apply (
                Select RetSeq = row_number() over (order by (Select null))
                      ,RetVal = ltrim(rtrim(B2.i.value('(./text())[1]', 'varchar(max)')))
                From  (Select x = Cast('<x>' + replace(Codes,',','</x><x>')+'</x>' as xml).query('.')) as B1
                Cross Apply x.nodes('x') AS B2(i)
             ) B

Returns

Name    RetSeq  RetVal
Josh    1       A2A-8292
Adam    1       D2C-1292
Adam    2       B2A-7292
Jery    1       A2A-1292
Jery    2       F2A-2292
Jery    3       C2A-2292
0 голосов
/ 07 сентября 2018

Взятие функции разделения строки из этого ответа: T-SQL строка разделения

Вы можете выполнить свой запрос следующим образом:

SELECT T.Name, X.*
FROM TABLE AS T
CROSS APPLY dbo.splitstring(Codes) AS X;
...