2013-07-18 46 views
1

我無法自己弄清楚這一點。希望有人能幫助我。在SQL Server中合併多行

我有三個表:userscardsrefereesusers_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) 

等等......

所有我能得到的是多當用戶擁有多於一張卡的行時。那麼我怎麼能像這樣結合他們。

謝謝你給任何人,誰可以幫我'

編輯:!

目前我只是用LEFT JOIN小號

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