【问题标题】:Convert values in related table to comma-separated list将相关表中的值转换为逗号分隔的列表
【发布时间】:2021-10-10 19:20:33
【问题描述】:

我有两个 SQL Server 表:

TableA                  TableB
+------+--------+       +-----+------------+
| aid  |  Name  |       | aid |   Activity |
+------+--------+       +-----+------------+ 
| 1    |   Jim  |       | 1   |   Skiing   |
| 2    |   Jon  |       | 1   |   Surfing  |
| 3    |   Stu  |       | 1   |   Riding   |
| 4    |   Sam  |       | 3   |   Biking   |
| 5    |   Kat  |       | 3   |   Flying   |
+------+--------+       +-----+------------+

我正在尝试以下结果,其中相关活动位于逗号分隔列表中:

+------+--------+------------------------------+
| aid  |  Name  |   Activity                   |
+------+--------+------------------------------+
| 1    |   Jim  |  Skiing, Surfing, Riding     |
| 2    |   Jon  |  NULL                        |
| 3    |   Stu  |  Biking, Flying              |
| 4    |   Sam  |  NULL                        |
| 5    |   Kat  |  NULL                        |
+------+--------+------------------------------+ 

我试过了:

SELECT  aid, Name, STRING_AGG([Activity], ',') AS Activity
FROM    TableA 
        INNER JOIN TableB
        ON TableA.aid = TableB.aid
GROUP BY aid, Name

有人可以帮我处理这个 SQL 查询吗?谢谢。

【问题讨论】:

  • 您使用的是什么关系型数据库?你有表结构吗?你试过什么?
  • 我在 Microsoft SQL Server Management Studio v18.8 中。我读到了一个名为 STRING_AGG 的东西,但不知道如何应用它。
  • 我也查看了 XML PATH,但找不到与我正在做的足够相似的示例。
  • 当您尝试该代码时发生了什么,为什么它不起作用?

标签: sql sql-server tsql join relational-database


【解决方案1】:

如果您使用的是 SQL Server 2017 或更高版本,则可以使用 OUTER APPLY 聚合字符串。

drop table if exists #TableA;
go
create table #TableA (
  aid            int not null,
  [Name]         varchar(10) not null);

insert #TableA(aid, [Name]) values 
(1, 'Jim'),
(2, 'Jon'),
(3, 'Stu'),
(4, 'Sam'),
(5, 'Kat');

drop table if exists #TableB;
go
create table #TableB (
  aid            int not null,
  [Activity]     varchar(10) not null);

insert #TableB(aid, [Activity]) values 
(1, 'Skiing'),
(1, 'Surfing'),
(1, 'Riding'),
(3, 'Biking'),
(3, 'Flying');

select a.aid, a.[Name], oa.sa
from #TableA a
     outer apply (select string_agg(b.Activity, ', ') sa
                  from #TableB b
                  where a.aid=b.aid) oa;
Name    sa
Jim     Skiing, Surfing, Riding
Jon     NULL
Stu     Biking, Flying
Sam     NULL
Kat     NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多