我有一个像
这样的结构的表name properties
x thing1, thing2, thing3
y otherthing1, otherthing2, otherthing3
我希望将此映射到一对多的关系,如
name properties
x thing1
x thing2
x thing3
以下解决方案我可以使用,但是在SQL Server
中运行Maxrecursion选项;with tmp(brandName, drugList, genericName) as (
select brandName, LEFT(genericName, CHARINDEX(',',genericName+',')-1),
STUFF(genericName, 1, CHARINDEX(',',genericName+','), '')
from eeeee
where LEN(genericName) - LEN(replace(genericName,',','')) < 100
union all
select brandName, LEFT(genericName, CHARINDEX(',',genericName+',')-1),
STUFF(genericName, 1, CHARINDEX(',',genericName+','), '')
from tmp
where genericName > ''
)
select brandName, drugList
from tmp
order by brandName
where子句是运行此查询的内容,因为多值列中有一些行在列表中有超过100个项目。有没有办法偷偷摸摸并覆盖SQL Server的递归最大限制100?或者最好继续将具有超过100个值的列拆分为两个,然后进行递归?
答案 0 :(得分:1)
我可以在不使用递归的情况下建议更有效的解决方案 -
DECLARE @temp TABLE
(
name NVARCHAR(50)
, properties NVARCHAR(1000)
)
INSERT INTO @temp (name, properties)
VALUES
('x', 'thing1, thing2, thing3'),
('y', 'otherthing1, otherthing2, otherthing3')
SELECT
data.name
, property = LTRIM(data.property)
FROM (
SELECT
name = p.value('(./n)[1]', 'NVARCHAR(50)')
, property = p.value('(./s)[1]', 'NVARCHAR(1000)')
FROM (
SELECT field = CAST('<r><s>' + REPLACE(t.properties + ',', ',', '</s><n>' + t.name + '</n></r><r><s>') + '</s></r>' AS XML)
FROM @temp t
) d
CROSS APPLY field.nodes('/r') t(p)
) data
WHERE data.name IS NOT NULL
是的,当然。表中的每个字符串都有一个固定的分隔符char。我们将separator char替换为XML结构的一部分。我们得到这样的行:
thing1, thing2, thing3 -> <r><s>thing1</s><s>thing2</s><s>thing3</s></r>
将字符串转换为XML日期类型并解析形成的树:
<r>
<s>thing1</s>
<n>x</n>
</r>
<r>
<s> thing2</s>
<n>x</n>
</r>
<r>
<s> thing3</s>
<n>x</n>
</r>