Объединение значений строк из нескольких таблиц в одну ячейку результата - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь создать своего рода отчет и с трудом пытаюсь понять, как можно выполнить эту часть с помощью одного выбора в SQL (мой опыт ограничен курсом баз данных и некоторыми рабочими знаниями - больше внешнего интерфейса разработчика).

Я должен отметить, что объединение таблицы вопросов и таблицы привязок / тегов вопросов не является для меня проблемой - то, что я не могу обернуть вокруг себя, это то, как многократный значения могут быть добавлены в одну и ту же ячейку результата без нескольких неприятных циклов T- SQL.

Любые советы о том, как начать, будут огромной помощью.

Таблица 1: Таблица вопросов

ID  Content  CategoryName        
---------------------------     
1   ABC      Q1               
2   DEF      Q3               
3   GEH      Q3               

Таблица 2: Таблица тегов

Tag Id            Tag Name
---------------------------------
4                 Dream
5                 Light
6                 Recover

Таблица 3: Привязки тегов вопросов

BoundQuestion ID   BoundTagId
---------------------------------
1                  4
2                  5
3                  6
3                  4

Таблица желаемых результатов (таблица вопросов с добавленным столбцом тегов)

ID  Content  CategoryName   Tags     
----------------------------------------     
1     ABC      Q1           Dream    
2     DEF      Q3           Light    
3     GEH      Q3           Recover, Light

Спасибо всем, кто смотрит на это, надеюсь, что вы все в безопасности.

1 Ответ

3 голосов
/ 02 апреля 2020

Вы можете объединить три таблицы и агрегировать для создания списка тегов. Я предполагаю, что боковое соединение также должно быть эффективным вариантом, поскольку оно позволяет избежать внешней агрегации:

select q.*, t.*
from questions q
outer apply(
    select string_agg(tag_name, ', ') tags
    from questionTags qt
    inner join tags t on t.TagID = qt.BoundTagID
    where qt.BoundQuestionID = q.ID
) t

Обратите внимание, что string_agg() был добавлен в SQL Server 2017.

В более ранние версии, мы можем прибегнуть к решению for xml path:

select 
    q.*, 
    stuff(
        (
            ', ' + tag_name tags
            from questionTags qt
            inner join tags t on t.TagID = qt.BoundTagID
            where qt.BoundQuestionID = q.ID
            order by tag_name
            for xml path('') 
        ), 
        1, 2, ''
    ) tags
from questions q
...