2013-07-18 6 views
1

Я не могу понять это сам. Надеюсь, кто-то может мне помочь.Объединение нескольких строк в SQL Server

У меня есть три таблицы: users, cards, referees и users_cards

пользователей:

id | userName | referee_id 
---------------------------- 
1 | u1  | 1 
2 | u2  | 1 
3 | u3  | 2 

Судьи:

id | refName 
-------------- 
1 | ref1 
2 | ref2 

карта:

id | cardName 
-------------- 
1 | card1 
2 | card2 

Users_Cards:

user_id | card_id | color | number 
------------------------------------------- 
1  | 1  | red  | 123 
1  | 2  | yellow | 312 
2  | 2  | yellow | 523 
3  | 1  | red  | 344 

Результат я хочу, чтобы это:

id | userName | refName | cards 
1 |  u1  | ref1  | card1: red (123), card2: yellow (312) 
2 |  u2  | ref1  | card2: yellow (523) 
3 |  u3  | ref2  | card1: red (344) 

И так далее ...

Все, что я могу получить множественный строк, когда пользователь имеет более одной карты. Итак, как я могу объединить их так.

Спасибо кому-либо, кто мог бы мне помочь

EDIT:

В настоящее время я только с помощью LEFT JOIN s

SELECT UserName, refName cardName, color, number, 
FROM users 
LEFT JOIN referees ON users.referee_id = referees.id 
LEFT JOIN users_cards ON users.id = users_cards.user_id 
LEFT JOIN cards ON dbo.users_cards.card_id = cards.id 
+4

Почему этот вопрос с тегами [тег: MySQL] и [теги: SQL-сервер]? В названии упоминается «SQL Server» ... – eggyal

+0

опубликуйте запрос, который вы используете в настоящее время, чтобы мы могли лучше понять, как данные возвращаются. –

ответ

0
SELECT users.id, UserName, refName, 
cards = (
    SELECT 
     STUFF(( 
      SELECT ', card' + CAST(ROW_NUMBER() OVER (ORDER BY cards.id) AS VARCHAR) 
        +': '+ color + '(' + CAST(number AS VARCHAR) +')' 
      FROM 
       users_cards 
       LEFT JOIN cards ON dbo.users_cards.card_id = cards.id 
      WHERE users.id = users_cards.user_id 
      FOR XML PATH('')), 1, 1, '') 
) 
FROM users 
LEFT JOIN referees ON users.refereeid = referees.id 
+0

Спасибо. Кажется, это делает работу. Однако как я могу вернуть значения «NULL»? – user1428033

+0

В настоящий момент подзапрос в столбце карт возвращает NULL, если нет ассоциации с пользователем. Вы также можете изменить внутреннее соединение на левое соединение, если хотите разрешить нулевых судей. – phoenixgr

+0

Спасибо, он работает сейчас, как надо! – user1428033

0

Я думаю, что нет простого способа формата результат таблицы и добавьте ее к вашему результату. Вы можете попробовать сделать хранимую процедуру со следующим содержанием:

CREATE TABLE #temp 
(
    user_id int, 
    CardString nvarchar(50) 
) 

CREATE TABLE #userCards 
(
    user_id int, 
    CardsList nvarchar(50) 
) 

DECLARE @UserID int, 
     @cardName nvarchar(50), 
     @cardList nvarchar(250) 

INSERT INTO #temp 
SELECT user_id, cardName + ': ' + color + ' (' + number + ')' 
FROM User_Cards AS UC 
INNER JOIN Cards AS C ON C.card_id = UC.card_id 

WHILE EXISTS (SELECT * FROM #temp) 
BEGIN 
    SELECT TOP(1) @UserID = user_id FROM #temp 

    SET @cardList = '' 

    WHILE EXISTS (SELECT * FROM #temp WHERE user_id = @UserID) 
    BEGIN 
     SELECT TOP(1) @cardName = [CardString] FROM #temp WHERE user_id = @UserID 
     IF @cardList <> '' 
     SET @cardList = @cardList + ', ' 
     SET @cardList = @cardList + @cardName 
    END 

    INSERT INTO #userCards 
    VALUES (user_id, @cardList) 
END 

SELECT users.id, users.userName, referees.refName, CardsList 
FROM users 
LEFT JOIN referees ON users.referee_id = referees.id 
LEFT JOIN #userCards ON #userCards.card_id = users.user_id 

DROP TABLE #userCards 
DROP TABLE #temp 

Это возвратит содержание вы хотели. Вы можете также определить агрегатную функцию (см http://msdn.microsoft.com/en-us/library/ms190678.aspx)

Смежные вопросы