SQL Wie mehrere Records vereinen und...

Hendoul

Commander
Registriert
Apr. 2008
Beiträge
2.050
Hi :)

Ich hätte gerne 1 record als Resultat:
select * from tmp;

sollte ausspucken:
1. "Heribert, Gieselherr, Kunigunde"

und nicht:
1. Heribert
2. Gieselherr
3. Kunigunde

Das SQL dazu:
http://sqlfiddle.com/#!9/422219/1

oder:
Code:
create table reise(id int, name varchar(255));
create table teilnehmer(id int, name varchar(255), reiseid int);
create table tmp(name varchar(255));

insert into reise(id, name) values (1, "Auf nach Hawaii");
insert into reise(id, name) values (2, "Nirvana");

insert into teilnehmer(id, name, reiseid) values (1, "Heribert", 1);
insert into teilnehmer(id, name, reiseid) values (2, "Gieselherr", 1);
insert into teilnehmer(id, name, reiseid) values (3, "Kunigunde", 1);
insert into teilnehmer(id, name, reiseid) values (4, "Esmeralda", 2);

insert into tmp(reiseid, name) values(t.reiseid, select t.name from reise r inner join teilnehmer t on t.reiseid = r.id);


Wobei das leider auf SQL-Fiddle nicht läuft.

Weiss jemand wie ich die Abfrage so hinbekomme, dass ich nur einen Record für die gleiche reiseid bekomme und die Namen dort aneinanderhängen kann?
 
Zuletzt bearbeitet:
Gar nicht. Das machst du mit deiner Programmiersprache. Beschreibe doch dein reales Problem bzw. wieso die alle in einem Tupel oder was auch immer sein müssen.
 
Das macht dann das Programm und nicht das SQL. "Was" ruft dein SQL auf? PHP? Java? ...?
 
HominiLupus schrieb:
Beim SQL Server kannst du mit Union oder UNION ALL mehrer Abfragemengen zu einer vereinen.

Alterantive kannst du das z.B. noch mit 2 selfjoins oder per nested query machen...

greetz
hroessler
 
Zuletzt bearbeitet von einem Moderator:
Sowas sollte mit bestimmten Funktionen möglich sein.
In MySQL ist es wohl GROUP_CONCAT(), in Firebird heißt die Fkt list() ...

bei dir wärs dann wohl
select list(t.name) from reise r inner join teilnehmer t on t.reiseid = r.id
group by r.id,t.reiseid
 
kA ob dein SQL es unterstützt, aber wenn wirklich alles nebeneinander sein muss wäre vielleicht ein Cursor eine Lösung:

Code:
DECLARE @name VARCHAR(50) -- cursor variable
DECLARE @myvar varchar(max) -- result string
DECLARE mycursor CURSOR FOR
SELECT name FROM tmp
OPEN mycursor   
FETCH NEXT FROM mycursor INTO @name
WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @myvar = @myvar + @name + ', '
       FETCH NEXT FROM mycursor INTO @name   
END   
CLOSE mycursor   
DEALLOCATE mycursor
SELECT @myvar
 
Zuletzt bearbeitet:
Vielen Dank für die vielen Antworten :)
Ich benutze Sybase (:heul:)
Mit list(...) habe ich es probiert, allerdings scheint wohl meine Sybase Version diese noch nicht zu kennen, ich kriege die Fehlermeldung:
>[Fehler] Skriptzeilen: 57-77 -----------------------
Function 'LIST' not found. If this is a SQLJ function or SQL function, use sp_help to check whether the object exists (sp_help may produce a large amount of output)


Ich habe es jetzt noch mit folgendem probiert:
Code:
select name into #tmp2 from #tmp
DECLARE @data VARCHAR(200)
update #tmp2
set @data = @data + ' ' + name

Das gibt dann aber alles in einem Record aus, sprich es mischt die Teilnehmer von verschiedenen Reisen zusammen.
 
Zuletzt bearbeitet:
Zurück
Oben