-2

Ich habe die folgenden zwei TabellenAnzeige mehrerer Werte aus zwei Tabellen in einer Zeile in SQL Server

TableA   Table B 

id    bid bname  btitle 
----    ------------------------------ 
1    1 john  titlejohn 
2    1 william titlewilliam 
3    1 george titlegeorge 
       2 bill  titlebill 
       3 kyle  titlekyle 
       3 seb  titleseb 

ich eine Abfrage in SQL Server benötigen, die die folgende Ausgabe zeigt:

id name      title 
1 john,william,george  titlejohn,titlewilliam,titlegeorgw 
2 bill      titlebill 
3 kyle,seb     titlekyle,titleseb 

Bitte helfen .

Antwort

1

Hier ist eine Lösung. Es handhabt nur bname, aber Sie können es erweitern, um btitle zu handhaben. Die Verkettung von Spaltenwerten für einen bestimmten Schlüssel ist in SQL keine Selbstverständlichkeit. Sie brauchen also einen Trick, um die Tabelle zu durchlaufen und jede Zeile mit demselben Schlüssel zu extrahieren. Der Trick besteht darin, eine Speichertabelle mit einer Identitätsspalte (z. B. n) zu erstellen, die auf jeder Einfügung automatisch inkrementiert wird. Sie können dann durchschleifen und n = 1, dann n = 2 usw. auswählen, um die Zeichenfolge aufzubauen.

create function tbl_join_name(@id int) 
returns varchar(max) 
as 
begin 
    declare @tbl table (n int identity(1,1), name varchar(max), title varchar(max)) 
    insert @tbl(name, title) 
    select bname, btitle from TableB where bid = @id 

    declare @n int = 1, @name varchar(max) = '', @count int = (select count(*) from @tbl) 
    while @n <= @count begin 
     set @name = @name + (case @name when '' then '' else ',' end) + (select name from @tbl where n = @n) 
     set @n = @n + 1 
    end 
    return @name 
end 
go 

select id, tbl_join_name(id) as bname --, tbl_join_title(id) as btitle 
from TableA 

Es ist nicht sehr effizient, obwohl. Getestet mit Sql Server 2008 R2.

2
select id, name = stuff(n.name, 1, 1, ''), title = stuff(t.title, 1, 1, '') 
from TableA a 
    outer apply 
    (
     select ',' + bname 
     from TableB x 
     where x.bid = a.id 
     for xml path('') 
    ) n (name) 
    outer apply 
    (
     select ',' + btitle 
     from TableB x 
     where x.bid = a.id 
     for xml path('') 
    ) t (title) 
0

Ein anderer Weg:

SELECT A.id, 
     STUFF((SELECT ','+bname 
     FROM TableB B 
     WHERE B.bid = A.id 
     FOR XML PATH('')),1,1,'') as name, 
     STUFF((SELECT ','+btitle 
     FROM TableB B 
     WHERE B.bid = A.id 
     FOR XML PATH('')),1,1,'') as title 
FROM TableA A 

Ausgang:

id name    title 
1 john,william,george titlejohn,titlewilliam,titlegeorge 
2 bill    titlebill 
3 kyle,seb   titlekyle,titleseb