使用 STRING_AGG 的 SQL 查询在连接 3 个表时给出重复项

标签 sql sql-server

我正在尝试将 3 个表连接在一起(事件、符号、类别)。 这是基本设计

事件表:

Id | Title
-----------
 1 | Testing
 3 | Debugging

符号表:

Event_Id | Symbol
-----------------
    1    |  TT
    1    |  UU

类别表:

Event_Id |  Category
--------------------
    1    |   XV
    1    |   XX
    3    |   XL

我编写的连接查询是:

SELECT event.Id , STRING_AGG(symbol.symbol, ',') symbol, STRING_AGG(category.category, ',') as category 
FROM Event as event 
    LEFT JOIN Category category ON event.publisherID = category.Id
    LEFT JOIN Symbol symbol on event.publisherID = symbol.Id
GROUP BY event.Id

我得到的结果是:

Id |     symbol    |  category
---------------------------------
 1 |  TT,UU,TT,UU  | XV,XV,XX,XX
 3 |     NULL      |    XL

如何避免符号和类别列重复?

最佳答案

在这种情况下,OUTER APPLY 提供了很大的帮助:

SELECT e.Id , s.symbols, c.categories 
FROM Event e OUTER APPLY
     (SELECT STRING_AGG(c.category, ',') as categories
      FROM Category c
      WHERE e.publisherID = c.Id
     ) c OUTER APPLY
     (SELECT STRING_AGG(s.symbol, ',') as symbols
      FROM Symbol s
      WHERE e.publisherID = s.Id
     ) s;

通过避免外部聚合,这也应该更快。我应该注意到,上面的内容与相关子查询非常相似:

SELECT e.Id , s.symbols, c.categories 
       (SELECT STRING_AGG(c.category, ',')
        FROM Category c
        WHERE e.publisherID = c.Id
       ) as categories,
       (SELECT STRING_AGG(s.symbol, ',')
        FROM Symbol s
        WHERE e.publisherID = s.Id
       ) as symbols
FROM Event e;

关于使用 STRING_AGG 的 SQL 查询在连接 3 个表时给出重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68655512/

相关文章:

mysql - 甲骨文 "LIMIT n,m"等效

sql-server - T-SQL 整数数组排序

sql - 使用 'no-symbol' 字符串搜索越南语单词

java - 在 SQLServer 中使用带 datetimeoffset 的 ZonedDateTime

MySQL 查询返回当前日期的 -7 到 +7?

sql - 在 hive 中查找一个月的最后一天

sql-server - 从 Visual Studio 将 DB 与 Azure MFA 连接以将项目解决方案与 Azure DB 进行比较?

SQL SELECT FREETEXT 按等级排序

SQL Server 查询 - 插入问题

java - 在 jooq 中设置 NULL 值