我正在尝试将 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/