繁体   English   中英

从不同表中的多行中选择数据SQL Server

[英]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 PATHSTUFF创建分隔的字符串:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM