SQL Server - 使用同一表中的字段和其他表中的值在所有表记录中更新字段

时间:2016-09-21 12:37:44

标签: sql sql-server

我有这种情况:

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,它可能是第一个,无关紧要。

1 个答案:

答案 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