Как я могу выбрать несколько строк и каскадировать их? - PullRequest
0 голосов
/ 02 августа 2009

Допустим, у меня есть три таблицы:

поля таблицы1:

memberid | name

поля таблицы2:

interestId | interestName

table3 (используется для установления связи между участником и интересом):

memberid | interestId 

и теперь я знаю, что могу использовать от inner join до select всех интересов одного участника.

Но как я могу объединить все интересы в один ряд ???

Например, я могу выбрать этот результат:

memberid   name    interstId   interestName
1         dennis   1            play basketball
1         dennis   2            music
1         dennis   3            moive

но результат, который я хочу получить:

memberid   name    interests
1          dennis  play basketball, music, moive

Как мне написать SQL-запрос?

Заранее спасибо!

Ответы [ 6 ]

1 голос
/ 02 августа 2009

Начиная с SQL Server 2005, вы можете использовать XML Path () для объединения значений. Похоже, что это очень продуктивно.

РЕДАКТИРОВАТЬ: Протестировал следующее и работает

SELECT
    t1.memberid,
    t1.[name],
    ISNULL(STUFF(
      (
        SELECT
          ', ' + t2.interestName
          FROM 
              table2 t2
          INNER JOIN 
              table3 t3            
              ON 
              t2.interestId = t3.interestId
          WHERE 
              t3.memberid = t1.memberid
          FOR XML PATH('')
       ), 1, 2, ''
    ), 'None') As interests
FROM
    table1 t1
GROUP BY
    t1.memberid,
t1.[name]

Пример кода:

DECLARE @table1 TABLE ( memberid INT IDENTITY(1,1), name VARCHAR(25) )

INSERT INTO @table1 VALUES('dennis');
INSERT INTO @table1 VALUES('mary');
INSERT INTO @table1 VALUES('bill');

DECLARE @table2 TABLE ( interestId INT IDENTITY(1,1), interestName VARCHAR(25) )

INSERT INTO @table2 VALUES('play basketball');
INSERT INTO @table2 VALUES('music');
INSERT INTO @table2 VALUES('movie');
INSERT INTO @table2 VALUES('play hockey');
INSERT INTO @table2 VALUES('wine tasting');
INSERT INTO @table2 VALUES('cheese rolling');

DECLARE @table3 TABLE ( memberid INT, interestId INT )

INSERT INTO @table3 VALUES(1,1);
INSERT INTO @table3 VALUES(1,2);
INSERT INTO @table3 VALUES(1,3);
INSERT INTO @table3 VALUES(2,2);
INSERT INTO @table3 VALUES(2,4);
INSERT INTO @table3 VALUES(2,6);
INSERT INTO @table3 VALUES(3,1);
INSERT INTO @table3 VALUES(3,5);
INSERT INTO @table3 VALUES(3,6);

    SELECT
        t1.memberid,
        t1.[name],
        ISNULL(STUFF(
          (
            SELECT
              ', ' + t2.interestName
              FROM 
                  @table2 t2
              INNER JOIN 
                  @table3 t3            
                  ON 
                  t2.interestId = t3.interestId
              WHERE 
                  t3.memberid = t1.memberid
              FOR XML PATH('')
           ), 1, 2, ''
        ), 'None') As interests
    FROM
        @table1 t1
    GROUP BY
        t1.memberid,
        t1.[name]

Результаты

memberid    name                      interests
----------- ----------------------------------------------------------------------- 
1           dennis                    play basketball, music, movie
2           mary                      music, play hockey, cheese rolling
3           bill                      play basketball, wine tasting, cheese rolling
1 голос
/ 02 августа 2009
0 голосов
/ 03 августа 2009
SELECT    t1.memberid,    t1.name,   
 STUFF( 
             ( SELECT          ', ' + interestName          
               FROM table2 t2  
               inner join table3 as t3 
               on t2.interestId = t3.interestId and t3.memberid = t1.memberid           
               FOR XML PATH('')      //use to merge the interests
             ), 1, 2, ''    
      ) As interests
FROM    table1

Это работает

0 голосов
/ 02 августа 2009

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

GROUP_CONCAT

только что увидел комментарий о системе dbms, но он будет работать с mysql.

0 голосов
/ 02 августа 2009

Зависит от конкретной базы данных. Может быть, это поможет вам (используя T-SQL и MS SQL Server) для известного memberid:

declare @result varchar(8000)
set @result = ''
declare @memberid int
set @memberid = 1

select @result = str(@memberid) + ' ' + (select name from table1 where memberid = @memberid) + ' '

select @result = @result + str(interestid) + ' ' + interest
from
(
select table2.interestid, table2.interestname
from table3 
inner join table2 on table2.interestid = table3.interestid
where table3.memberid = @memberid
) t1

select left(@result, LEN(@result) - 1)
0 голосов
/ 02 августа 2009

, так как вы не указали свою базу данных, я могу посоветовать взглянуть на левые (правые) объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...