[英]Select data in one row from multiply rows from different tables SQL Server
我在这里寻找答案,但找不到我的问题的正确答案。 我有桌子:
---------- ---------- ----------
| offers | | bids | | users |
---------- ---------- ----------
id id id
.... offer_id first_name
.... user_id last_name
.... .....
现在,我需要为每个商品ID分配用户的姓氏和名字
offers.id = bids.offers_id and bids.user_id = users.id
例:
offers bids users
------------------ ---------------------- ----------------
|id| ...| ....| |id| offer_id| user_id| |id| first_name| last_name|
------------------ ----------------------- --------------------------
|1 | ...|.....| |1 | 1 | 2 | | 2| Peter | Jackson |
|2 | ...|.....| |2 | 1 | 3 | | 3| Adam | Black |
|3 | 1 | 6 | | 4| Roy | Wright |
|4 | 2 | 5 | | 5| Eva | Cekovsky |
|5 | 2 | 7 | | 6| Martin | Tyson |
| 7| Vera | Vornel |
输出应该是这样的
offer_id full_name
--------------------------------------------------------------
| 1 | Peter Jackson, Adam Black, Martin Tyson |
--------------------------------------------------------------
| 2 | Eva Cekowsky, Vera Vornel |
--------------------------------------------------------------
我可以使用CONCAT
轻松地将姓氏与姓氏联系起来,如果每个数据都在同一张表中,则可以这样做,但是我无法弄清楚。
对于MS SQL Server 2017,可以使用STRING_AGG函数:
SELECT
b.offer_id,
STRING_AGG(CONCAT(u.first_name,' ',u.last_name), ', ') AS full_name
FROM bids b
JOIN users u on b.user_id = u.id
GROUP BY b.offer_id
您可以强制使用逗号分隔的名称,例如:
SELECT
b.offer_id,
STRING_AGG (CONCAT(u.first_name,' ',u.last_name), ', ')
WITHIN GROUP (ORDER BY u.last_name, u.first_name ASC)
AS full_name
FROM bids b
JOIN users u on b.user_id = u.id
GROUP BY b.offer_id
这应该是您所追求的。 它使用FOR XML PATH
和STUFF
创建分隔的字符串:
CREATE TABLE #offer (id int);
INSERT INTO #offer
VALUES (1),(2);
CREATE TABLE #bid (id int,
offer_id int,
user_id int);
INSERT INTO #bid
VALUES (1,1,2),
(2,1,3),
(3,1,6),
(4,2,5),
(5,2,7);
CREATE TABLE #user (id int,
first_name varchar(10),
last_name varchar(10));
INSERT INTO #user
VALUES (2,'Peter','Jackson'),
(3,'Adam','Black'),
(4,'Roy','Wright'),
(5,'Eva','Cekovsky'),
(6,'Martin','Tyson'),
(7,'Vera','Vornel');
GO
SELECT o.id AS offer_id,
STUFF((SELECT ', ' + first_name + ' ' + last_name
FROM #bid b
JOIN #user u ON b.user_id = u.id
WHERE b.offer_id = o.id
FOR XML PATH('')),1,2,'') AS Full_name
FROM #offer o;
GO
DROP TABLE #offer;
DROP TABLE #bid;
DROP TABLE #user;
如有疑问,请发表评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.