2013-03-20 7 views
5

Mam dwie tabele o nazwach Districts i Schools. Tabela Districts zawiera kolumnę o nazwie Schools.aktualizuje pole tabeli bazy danych z listą oddzielonych przecinkami od połączenia

muszę wypełniać kolumny tabeli DistrictsSchools z odpowiedniego Schools stołu, tak że każdy wiersz tabeli Districts jest oddzielony przecinkami listę wartości nazw średnich z tabeli Schools.

Jak mogę to zrobić? Czy powinienem użyć zapytania UPDATE lub procedury składowanej?

Mam tylko tak daleko, jak:

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 | 
+----------+------------+------------+ 

Jak Wyjście musi być

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

Odpowiedz

4

Z pomocą FOR XML PATH i STUFF Łączenie wartości, można łatwo uaktualnić tabelę District z pożądanego rezultatu.

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

Wykorzystanie 'STUFF (..., 1, 2, '')' zamiast od separatora ' ''' ma 2 znaki - to zapobiegnie listę z konieczności wiodąca przestrzeń – ovinophile

Powiązane problemy