我有这种情况:
表Territory
ID (int) - CODE (varchar) - NAME (varchar)
数据:
1 - GB - UNITED KINGDOM
2 - GB - ISLE OF MAN
3 - GB - NORTHERN IRELAND
4 - PT - PORTUGAL
5 - DE - GERMANY
6 - DE - HELGOLAND ISLAND
表Rules
:
ID (int) - TERRITORY_CODES (varchar) - TERRITORY_IDS (varchar)
1 - 'GB,PT' - NULL
2 - 'DE,PT' - NULL
我知道第二张表不应该是这样的,但我没有选择改变它。
我想在列TERRITORY_IDS
中填充以逗号分隔的表TERRITORY
中的ID。例如:
表Rules
ID (int) - TERRITORY_CODES (varchar) - TERRITORY_IDS (varchar)
1 - 'GB,PT' - '1,4'
2 - 'DE,PT' - '5,4'
每个区域代码都有几个ID,但我想为每个区域表只有一个ID,它可能是第一个,无关紧要。
答案 0 :(得分:1)
您要做的是错误想法。你认识到这是一个坏主意是一件好事。但对于那些阅读这个问题并且不理解为什么这么糟糕的人来说,这违反了First normal form (1NF) principle。所有列都应该是原子的,这意味着它们只保存1个值。
让我们了解如何做到这一点Coalesce来解救。
由于我不知道为什么'gb,pt'
和'de,pt'
被分组,所以我没有将它包装在Cursor中以遍历整个表格。但是你可以轻松地将它包装在游标中并为你完成整个表格内容。
DECLARE @TERRITORY_Ids varchar(100)
SELECT @TERRITORY_Ids = COALESCE(@TERRITORY_Ids+ ', ', '') +
Id
FROM table_terrytory
WHERE code in ('gb','pt')
INSERT INTO table_rules
SELECT 'gb,pt',@TERRITORY_Ids