2009-08-02 11 views
0

Sagen wir, ich habe drei Tabellen:Wie kann ich mehrere Zeilen auswählen und kaskadieren?

tabelle1 Felder:

memberid | name 

table2 Felder:

interestId | interestName 

table3 (verwendet, um eine Beziehung zwischen den Mitglieds zu machen und Zinsen) Felder:

memberid | interestId 

und jetzt weiß ich, ich kann Benutzer inner join bis select ein Mitglied alle Interessen.

Aber wie kann ich alle Interessen in einer einzigen Zeile kaskadieren ???

Zum Beispiel kann ich dieses Ergebnis wählen:

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

aber das Ergebnis ich will, ist zu bekommen:

memberid name interests 
1   dennis play basketball, music, moive 

Wie kann ich die SQL-Abfrage schreiben?

Vielen Dank im Voraus!

+2

Was RDBMS? SQL Server 2000, 2005, MySQL, usw. –

+0

SQL Server 2005 – MemoryLeak

Antwort

1

In SQL Server 2005 können Sie XML Path() zum Verketten von Werten verwenden. Es scheint auch sehr performant zu sein.

EDIT: Haben Sie testeten die folgenden und arbeitet

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] 

Beispielcode:

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] 

Ergebnisse

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

Spalte 't3.interseId 'ist in der Auswahlliste ungültig, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. Was ist los? – MemoryLeak

+0

Hallo Dennis, habe den Code jetzt behoben und ein funktionierendes Beispiel zur Verfügung gestellt :) –

+0

+1 Sehr cool :) –

0

Da Sie Ihre Datenbank nicht angegeben haben, kann ich Ihnen einen Blick auf die linken Joins (rechts) geben.

0

Hängt von bestimmten Datenbank ab. Vielleicht wird es Ihnen helfen, für einen bekannten memberid (T-SQL und MS SQL Server):

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

vielen Dank – 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 

Dies funktioniert

Verwandte Themen