2013-12-09 4 views
1

Я хочу, чтобы объединить запись с таким же идентификатором пользователя в одну запись и разделить их с ,Объединение записей в одной записи с помощью запроса SQL

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

tblUsers:

Id  Name 
---------------- 
1  name1 
2  name2 
3  name3 

tblPhone:

Id  Phone 
----------------- 
1  p11 
1  p12 
2  p21 
2  p22 
2  p23 

мне нужен SQL запрос, Ретур n эти результаты:

Id  Name  Phone 
------------------------------ 
1  name1  p11,p12 
2  name2  p21,p22,p23 
3  name3  null 

любое предложение?

+0

пытались ли вы что-нибудь? –

+1

[link] (http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string) –

+0

На самом деле мой разум совершенно пуст для таких глупых результатов: D – HaMeD

ответ

0

Попробуйте это:

SELECT 
    id,Name, 
    STUFF((SELECT ','+Phone FROM tblPhone 
      WHERE id=tblusers.Id FOR XML PATH('')),1,1,'') 
FROM 
    tblUsers 

SQLFiddle demo

1

Этот запрос будет выполнять работу

select u.Id, u.Name, 
stuff((select ','+p.Phone 
     from tblPhone p 
     where p.Id = u.Id 
     for XML path('')),1,1,'') 
from tblUsers u 

SQL Fiddle demo

+1

+1 ; Всегда приятно видеть функции, которые вы никогда не пробовали/использовали раньше – Schuere

0

Прежде всего: Соглашение об именах вашего tblPhone таблицы должны быть как следует:

ID | UserId | Phone 

Где UserId является вашей ссылкой на пользователей, а идентификатор является основным ключом tblPhone. (Желательно семя идентичности)

с таким подходом вы можете создать цикл для обработки значений

DECLARE @table table(userid int, Phones(varchar(max)) 
DECLARE @min int = 1, @max int = select count(1) from tblPhone 

DECLARE @userid int, @Phone varchar(50) 

for(@min <[email protected]) 
BEGIN 
    select @userid = UserId, @Phone = Phone from tblPhone where ID = @min 
    if(@userid != null) 
    BEGIN 
    IF NOT EXIST(Select * from @table where userid = @userid) 
    BEGIN 
     --Create a line 
     INSERT INTO @table 
     VALUES(@userid, @Phone) 
    END 
    ELSE 
    BEGIN 
     --Update the line 
     UPDATE @table 
     Set Phone = Phone + ', ' + @Phone 
     WHERE userid = @userid 
    END 
    END 

SET @Min = @Min + 1 
END 

Select * from @table 
0
SELECT Id,Name, Phone= 
STUFF((SELECT ', ' + Phone 
     FROM tblPhone 
     WHERE tblUsers.id = tblPhone.id 
     FOR XML PATH('')), 1, 2, '') 
FROM tblUsers 
GROUP BY id,Name 
Смежные вопросы