2013-03-20 80 views
5

我有两个名为DistrictsSchools的表。 Districts表包含名为Schools的列。使用逗号分隔的列表更新数据库表字段

我需要从相应的Schools表填充Districts表的Schools列,因此,在Districts表中的每一行都有一个逗号分隔从Schools表学校名称的值列表。

我该怎么做?我应该使用UPDATE查询还是存储过程?

我只得到尽可能:

SQL Fiddle

Districts Table

+------------+------+---------+ 
| DistrictId | Name | Schools | 
+------------+------+---------+ 
|   1 | a |   | 
|   2 | b |   | 
|   3 | c |   | 
|   4 | d |   | 
+------------+------+---------+ 

Schools Table

+----------+------------+------------+ 
| SchoolId | SchoolName | DistrictId | 
+----------+------------+------------+ 
|  1 | s1   |   1 | 
|  2 | s2   |   1 | 
|  3 | s3   |   2 | 
|  4 | s4   |   2 | 
|  5 | s5   |   4 | 
+----------+------------+------------+ 

如何需要将输出

+------------+------+---------+ 
| DistrictId | Name | Schools | 
+------------+------+---------+ 
|   1 | a | s1,s2 | 
|   2 | b | s3,s4 | 
|   3 | c |   | 
|   4 | d | s5  | 
+------------+------+---------+ 

回答

4

随着FOR XML PATHSTUFF帮助来串联值,你可以轻松地与您期望的结果更新表District

UPDATE a 
SET  a.Schools = b.SchoolList 
FROM Districts a 
     INNER JOIN 
     (
      SELECT DistrictId, 
        STUFF((SELECT ', ' + SchoolName 
          FROM Schools 
          WHERE DistrictId = a.DistrictId 
          FOR XML PATH ('')) 
         , 1, 1, '') AS SchoolList 
      FROM Districts AS a 
      GROUP BY DistrictId 
     ) b ON A.DistrictId = b.DistrictId 
WHERE b.SchoolList IS NOT NULL 
+0

使用'的东西(...,1,2, '')',而不是因为分隔符' '''是2个字符 - 这将防止从具有列表领先的空间 – ovinophile 2017-07-21 19:10:17