У меня есть таблица на моем MSSQL-сервере, давайте назовем ее blogPost
. У меня также есть две таблицы тегов, давайте назовем их fooTag
и barTag
. Таблицы тегов используются для тегирования таблицы blogPost
, которая имеет одинаковую структуру.
blogPost
| postId | title | body |
+--------+---------------------+-------------+
| 1 | The life on a query | lorem ipsum |
+--------+---------------------+-------------+
fooTag and barTag
| postId | tagName |
+--------+--------------+
| 1 | sql |
| 1 | query |
| 1 | select-query |
+--------+--------------+
Я хочу получить один блог вместе со всеми его тегами в одной строке, поэтому STRING_AGG()
кажется подходящим для выполнения запроса, подобного этому:
SELECT blogPost.*, STRING_AGG(fooTag.tagName, ';') as [fooTags], STRING_AGG(barTag.tagName, ';') as [barTags]
FROM blogPost
LEFT JOIN fooTag ON blogPost.postId = fooTag.postId
LEFT JOIN barTag ON blogPost.postId = barTag.postId
WHERE postId = 1
GROUP BY blogPost.postId, title, body
При созданииэтот запрос я бы ожидал получить результат
| postId | title | body | fooTags | barTags |
+--------+---------------------+-------------+-------------------------+-------------------------+
| 1 | The life on a query | lorem ipsum | sql;query;select-query | sql;query;select-query |
+--------+---------------------+-------------+-------------------------+-------------------------+
Но вместо этого я получаю этот результат, где тэги бара (т.е. последний выбранный STRING_AGG) дублируются.
| postId | title | body | fooTags | barTags |
+--------+---------------------+-------------+-------------------------+-----------------------------------------------+
| 1 | The life on a query | lorem ipsum | sql;query;select-query; | sql;sql;sql;query;query;query;select-query;select-query;select-query |
+--------+---------------------+-------------+-------------------------+-----------------------------------------------+
ПомещениеbarTags
последний в операторе SELECT делает так, что barTags
получает дубликаты вместо fooTags
. Количество созданных дубликатов, по-видимому, связано с количеством столбцов строк, которые агрегируются вместе в первом столбце результата STRING_AGG
, поэтому, если fooTags
имеет 5 строк для агрегации вместе, будет 5 дубликатов каждого barTag
вbarTags
столбец в результате.
Как получить желаемый результат без дубликатов?