在SQL Server中组合多行
我自己也弄不明白。希望有人能帮助我 我有三张桌子:用户、卡片、裁判和用户卡 用户: 裁判员: 卡片: 信用卡用户: 我想得到的结果是:在SQL Server中组合多行,sql,sql-server,many-to-many,Sql,Sql Server,Many To Many,我自己也弄不明白。希望有人能帮助我 我有三张桌子:用户、卡片、裁判和用户卡 用户: 裁判员: 卡片: 信用卡用户: 我想得到的结果是: id | userName | refName | cards 1 | u1 | ref1 | card1: red (123), card2: yellow (312) 2 | u2 | ref1 | card2: yellow (523) 3
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)
等等
当用户有多张卡时,我只能得到多行。那么我怎样才能像这样组合它们呢
谢谢所有能帮助我的人!`
编辑:
目前我只使用左连接
我认为没有简单的方法可以格式化表的结果并将其附加到结果中。 您可以尝试使用以下内容执行存储过程:
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
这将返回您想要的内容。
您还可以定义一个聚合函数,请参见为什么要标记此问题以及?标题提到SQL Server…发布您当前使用的查询,以便我们更好地了解数据返回的方式。谢谢。这似乎很管用。但是,我怎么能同时返回空值呢?现在,如果用户没有任何卡片关联,那么cards列中的子查询将返回空值。如果希望允许空引用,还可以将内部连接更改为左连接。
id | cardName
--------------
1 | card1
2 | card2
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)
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
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
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