Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Свързване на множество редове с данни в един ред

Можете да използвате STUFF за генериране на csv стойности. По-долу е това, което обикновено използвам.

    CREATE TABLE #Book
    (
        Id INT ,
        NAME VARCHAR(100) ,
        Description VARCHAR(100)
    );

CREATE TABLE #BookReader
    (
        BookId INT ,
        Name VARCHAR(100)
    );


CREATE TABLE #BookVersion
    (
        BookId INT ,
        Version VARCHAR(10)
    );


INSERT INTO #Book ( Id ,
                    NAME ,
                    Description )
VALUES ( 1 ,            -- Id - int
         'Book1' ,      -- NAME - varchar(100)
         'Book 1 Title' -- Description - varchar(100)
    ) ,
       ( 2 ,            -- Id - int
         'Book2' ,      -- NAME - varchar(100)
         'Book 2 Title' -- Description - varchar(100)
       ) ,
       ( 3 ,            -- Id - int
         'Book3' ,      -- NAME - varchar(100)
         'Book 3 Title' -- Description - varchar(100)
       ) ,
       ( 4 ,            -- Id - int
         'Book5' ,      -- NAME - varchar(100)
         'Book 5 Title' -- Description - varchar(100)
       );

INSERT INTO #BookReader ( BookId ,
                          Name )
VALUES ( 1 ,     -- BookId - int
         'James' -- Name - varchar(100)
    ) ,
       ( 2 ,        -- BookId - int
         'Stephane' -- Name - varchar(100)
       ) ,
       ( 2 ,       -- BookId - int
         'Michael' -- Name - varchar(100)
       );

INSERT INTO #BookVersion ( BookId ,
                           Version )
VALUES ( 1 ,  -- BookId - int
         'v1' -- Version - varchar(10)
    ) ,
       ( 1 ,  -- BookId - int
         'v2' -- Version - varchar(10)
       ) ,
       ( 2 ,  -- BookId - int
         'v1' -- Version - varchar(10)
       ) ,
       ( 2 ,  -- BookId - int
         'v2' -- Version - varchar(10)
       ) ,
       ( 2 ,  -- BookId - int
         'v3' -- Version - varchar(10)
       );


SELECT b.Id ,
       LTRIM(STUFF((   SELECT ', ' + br1.[Name] AS [text()]
                 FROM   #BookReader br1
                 WHERE  br1.BookId = b.Id
                 FOR XML PATH('')) ,
             1 ,
             1 ,
             '')) AS Reader ,
       LTRIM(STUFF((   SELECT ', ' + Version
                 FROM   #BookVersion bv1
                 WHERE  bv1.BookId = b.Id
                 FOR XML PATH('')) ,
             1 ,
             1 ,
             '')) AS version
FROM   #Book b;



DROP TABLE #Book;
DROP TABLE #BookReader;
DROP TABLE #BookVersion;

Резултат:

+----+--------------------+-------------+
| Id |       Reader       |   Version   |
+----+--------------------+-------------+
|  1 | James              | v1, v2      |
|  2 | Stephane, Michael  | v1, v2, v3  |
|  3 | NULL               | NULL        |
|  4 | NULL               | NULL        |
+----+--------------------+-------------+



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при конвертирането на dbtype_dbdate в дата

  2. Параметърът не работи толкова добре, колкото твърдото кодиране на стойността

  3. Грешка sql с невалидно име на колона

  4. Как да пренапишем Е РАЗЛИЧНО ОТ и НЕ Е РАЗЛИЧНО ОТ?

  5. Значението на квадратните скоби [] в дизайнера на таблици на MS-SQL?