2009-08-02 10 views
0

Disons que j'ai trois tables:Comment puis-je sélectionner plusieurs lignes et les cascader?

table1 champs:

memberid | name 

Table2 champs:

interestId | interestName 
champs

de Table3 (utilisés pour faire une relation entre membres et intérêts):

memberid | interestId 

et maintenant je sais que je peux user inner join à select tous les intérêts d'un membre.

Mais comment puis-je cascader tous les intérêts dans une seule ligne ???

Par exemple, je peux choisir ce résultat:

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

mais le résultat que je veux obtenir est:

memberid name interests 
1   dennis play basketball, music, moive 

Comment puis-je écrire la requête SQL?

Merci d'avance!

+2

Quel RDBMS? SQL Server 2000, 2005, MySQL, etc –

+0

SQL Server 2005 – MemoryLeak

Répondre

1

Il semble être très performant aussi.

EDIT: ont testé les éléments suivants et fonctionne

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] 

Exemple Code:

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] 

Résultats

memberid name      interests 
----------- ----------------------------------------------------------------------- 
1   dennis     play basketball, music, movie 
2   mary      music, play hockey, cheese rolling 
3   bill      play basketball, wine tasting, cheese rolling 
+0

Colonne 't3.interestId 'n'est pas valide dans la liste de sélection car il n'est contenu ni dans une fonction d'agrégat ni dans la clause GROUP BY. Qu'est-ce qui ne va pas? – MemoryLeak

+0

Salut Dennis, ont corrigé le code maintenant et fourni un exemple de travail :) –

+0

+1 Très cool :) –

0

puisque vous n'avez pas spécifié votre base de données, je peux vous conseiller de jeter un oeil à gauche (droite) jointures.

0

Dépend de la base de données particulière. Peut-être que cela vous aidera (en utilisant T-SQL et MS SQL Server) pour une connue 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

merci beaucoup – MemoryLeak

0
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 

Cela fonctionne

Questions connexes