我有一个由三列组成的表。
其中一列由逗号分隔的建筑物编号列表组成:
Id | PropertyNumber | BuildingNumbers | 4315 | 11594 | 1、5、6、10、10、11 |
---|---|---|
3434 | 44379 | 1, 1, 2, 2, 3, 3, 4, 4 |
由于以这种方式保存数据的坏主意,这似乎是一个相当复杂的任务。以后,你应该去掉这个结构。
我想这样的东西应该正常工作,但也许你需要做一些修改:
WITH split AS
(SELECT id, PropertyNumber,
CAST(split.Value AS INT) AS BuildingNumbers
FROM yourtable
CROSS APPLY STRING_SPLIT(yourtable.BuildingNumbers,',') split
GROUP BY id, PropertyNumber, CAST(split.Value AS INT)),
updateData AS
(SELECT id, PropertyNumber, STRING_AGG(BuildingNumbers,',') AS BuildingNumbers
FROM split
GROUP BY id, PropertyNumber)
UPDATE y SET y.BuildingNumbers = ud.BuildingNumbers
FROM yourtable y
INNER JOIN updateData ud
ON y.id = ud.id
AND y.PropertyNumber = ud.PropertyNumber;
我根据您的示例数据创建了一个提琴,它显示这应该是ok的:
您可以在小提琴中复制,其思想如下:
- 拆分逗号分隔的值列表中每个id的不同值。
- 重新构建每个id的逗号分隔的不同值的列表。
- 更新数据,用新的逗号分隔列表替换之前的列表
最后一点:这个答案关注的是如何更新你的数据,而不是如何在未来改进你的数据结构,因为这不是你的问题。
但是,我建议,正如在这个答案的开头已经说过的,检查您的结构并以更好的形式保存数据。这个答案中有一个选项。
我的建议与您的设计有关。我认为你需要重新考虑你的表格结构。我将详细说明Panagiotis Kanavos的答复。你应该有一个"建筑"表格和"属性"表格在"建筑"一栏会有一栏。PropertyID"您将使用它为每个单独的建筑物指定关系。您的表应该看起来像这样;
属性表;
PropertyID | PropertyName | 4315 | 11594 |
---|---|
3434 | 44379 |