Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

DOŁĄCZ do trzech tabel i agreguj dane z wielu wierszy dla każdego DISTINCT wiersza w oddzielnej kolumnie

Zakładając, że nie możesz zmienić struktur danych w celu uzyskania bardziej wydajnego zapytania, to zadziała:

--Populate sample data
SELECT 1 as key1,       2  as key2 INTO #tbl1
UNION ALL SELECT 1,       5 
UNION ALL SELECT 1,       6 
UNION ALL SELECT 1,       4 
UNION ALL SELECT 1,       8 

SELECT 1  as key1,     'Desc short' as shortkeydesc INTO #tbl2

SELECT 1   as key1,    'Desc a'  as [description] INTO #tbl3
UNION ALL SELECT 1,       'Desc c' 
UNION ALL SELECT 1,       'Desc aa' 
UNION ALL SELECT 1,       'Desc tt' 

--Combine data into semi-colon separated lists
SELECT 
key1
,STUFF(
    (
    SELECT
      ';' + CAST(t2.key2 AS VARCHAR(10))
    FROM #tbl1 t2
    WHERE t2.key1 = tbl1.key1
    FOR XML PATH('')
    ), 1, 1, ''
  )
,STUFF(
    (
    SELECT
      ';' + tbl2.shortkeydesc
    FROM #tbl2 tbl2
    WHERE tbl2.key1 = tbl1.key1
    FOR XML PATH('')
    ), 1, 1, ''
  )
,STUFF(
    (
    SELECT
      ';' + tbl3.[description]
    FROM #tbl3 tbl3
    WHERE tbl3.key1 = tbl1.key1
    FOR XML PATH('')
    ), 1, 1, ''
  )
FROM #tbl1 tbl1
GROUP BY tbl1.key1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy wartości indeksu programu SQL Server Null w nieklastrowym indeksie nieunikatowym?

  2. Jak wykonać wstawianie i zwracanie wstawionej tożsamości za pomocą Dappera?

  3. Pole dostawcy w ciągu połączenia oledb

  4. Niestandardowa funkcja agregująca (concat) w SQL Server

  5. wypełnienie pola tekstowego na drugim zaznaczeniu combobox zmienione w kaskadowym polu combobox w formularzu systemu Windows za pomocą c#