SQL 服务器 - 编写查询以规范化构造不当的模式中的逗号分隔值
SQL Server - write query that normalizes comma separated values in a poorly constructed schema
问题:我正在查询规范化程度很低的数据库(我对数据的设计没有发言权,也无法更改它)
给定以下数据库:
------------------------------------------
| Name | Codes |
------------------------------------------
| Josh | A2A-8292 |
-------------------------------------------
| Adam | D2C-1292, B2A-7292 |
-------------------------------------------
| Jery | A2A-1292, F2A-2292, |
| | C2A-2292 |
-------------------------------------------
如何编写 returns 规范化版本的查询,例如:
------------------------------------------
| Name | Codes |
------------------------------------------
| Josh | A2A-8292 |
-------------------------------------------
| Adam | D2C-1292 |
-------------------------------------------
| Adam | B2A-7292 |
-------------------------------------------
| Jery | A2A-1292 |
-------------------------------------------
| Jery | F2A-2292 |
-------------------------------------------
| Jery | C2A-2292 |
-------------------------------------------
从这个答案中获取字符串拆分函数:T-SQL split string
您可以运行您的查询如下:
SELECT T.Name, X.*
FROM TABLE AS T
CROSS APPLY dbo.splitstring(Codes) AS X;
如果您不能使用 TVF,这里有另一个选择
例子
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
问题:我正在查询规范化程度很低的数据库(我对数据的设计没有发言权,也无法更改它)
给定以下数据库:
------------------------------------------
| Name | Codes |
------------------------------------------
| Josh | A2A-8292 |
-------------------------------------------
| Adam | D2C-1292, B2A-7292 |
-------------------------------------------
| Jery | A2A-1292, F2A-2292, |
| | C2A-2292 |
-------------------------------------------
如何编写 returns 规范化版本的查询,例如:
------------------------------------------
| Name | Codes |
------------------------------------------
| Josh | A2A-8292 |
-------------------------------------------
| Adam | D2C-1292 |
-------------------------------------------
| Adam | B2A-7292 |
-------------------------------------------
| Jery | A2A-1292 |
-------------------------------------------
| Jery | F2A-2292 |
-------------------------------------------
| Jery | C2A-2292 |
-------------------------------------------
从这个答案中获取字符串拆分函数:T-SQL split string
您可以运行您的查询如下:
SELECT T.Name, X.*
FROM TABLE AS T
CROSS APPLY dbo.splitstring(Codes) AS X;
如果您不能使用 TVF,这里有另一个选择
例子
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