Показать 3 разных значения одного столбца и одной таблицы в одной строке результатов

Я использую SQL Server 2014 для своего проекта. У меня есть три таблицы:

Table A: 
Column: id
Table B:
Column: id, id_of_Table_A
Table C:
Column: id, id_of_Table_B, category

The relationship between A and B is one to many
The relationship between B and C is one to many

В таблице C есть 10 значений категорий для столбца category, но меня интересуют только три категории (cat1, cat2, cat3). Я надеюсь запросить и получить следующие результаты для трех категорий:

id_of_Table_A, category, category, category

У меня есть следующее утверждение:

select a.id, c.category from Table_C c 
join Table_B b on b.id = c.id_of_Table_B
join Table_A a on a.id = b.id_of_Table_A
where c.category = 'cat1' and a.id in (1, 2, 3)

Но в этом утверждении перечислены только

id_of_Table_A, cat1

который содержит только cat1 данного id_of_Table_A. Я надеюсь получить что-то вроде:

1, cat1, cat2, cat3

если cat1, cat2 и cat3 существуют в таблице C для данного идентификатора 1 в таблице A.

Если один оператор не может дать желаемых результатов, то хранимая процедура подойдет.

Обновлять

В следующем примере результаты

1, cat1, cat2, cat3

cat1, cat2, cat3 должны исходить из трех разных записей в таблице B. Предположим, у нас есть эти таблицы и строки:

Table A: 1,2
Table B: (1,1), (2,1), (3,1), (4,2), (5,2), (6,2)
Table c: (1,1,'cat3'), (2,2,'cat1'), (3,3,'cat2'), (4,4,'cat1'), (5,5,'cat4'), (6,6,'cat2')

Тогда ожидаемые результаты должны быть:

1, cat1, cat2, cat3

По сути, отношения таблиц образуют дерево. Я надеюсь найти корень (таблица A) с листьями cat1, cat2 и cat3 на непересекающихся путях от корня.

Демонстрационные данные лучше всего использовать как DDL + ДМЛ. Пожалуйста, редактировать ваш вопрос, чтобы включить его. Для получения дополнительной информации прочитай это.

Zohar Peled 27.05.2019 20:59
where c.category = 'cat1' означает, что вас интересует только cat1.
forpas 27.05.2019 21:04

Это просто пример. Я не могу написать запрос для получения результатов cat2 и cat3.

curious1 27.05.2019 21:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете объединить все категории для id_of_b в одно значение xml, а затем отобразить категории в столбцах. Что-то вроде этого.

declare @a table(id int)
declare @b table(id int,id_of_a int)
declare @c table(id int,id_of_b int,category varchar(50))
insert @a values(1),(2)
insert @b values(1,1),(2,1),(3,2)
insert @c values(1,1,'cat1'),(2,1,'cat2'),(3,1,'cat3'),(4,2,'cat4')
;with cte as(
  select a.id,
    cast((select category from @c c where c.id_of_b = b.id for xml auto,root,type) as xml) xcat
  from @a a inner join @b b on a.id = b.id_of_a
)
select id,
  t.v.value('c[1]/@category','varchar(50)') cat1,
  t.v.value('c[2]/@category','varchar(50)') cat2,
  t.v.value('c[3]/@category','varchar(50)') cat3
from cte
cross apply xcat.nodes('root') t(v)

Обновленный ответ на обновленный вопрос

declare @a table(id int)
declare @b table(id int,id_of_a int)
declare @c table(id int,id_of_b int,category varchar(50))
insert @a values(1),(2)
insert @b values (1,1), (2,1), (3,1), (4,2), (5,2), (6,2)
insert @c values (1,1,'cat3'), (2,2,'cat1'), (3,3,'cat2'), (4,4,'cat1'), (5,5,'cat4'), (6,6,'cat2')

;with cte as(
  select a.id,
    cast((select category from @c c inner join @b b on c.id_of_b = b.id 
       where b.id_of_a=a.id
       for xml auto,root,type) as xml) xcat
  from @a a 
)
select id,
  t.v.value('c[1]/@category','varchar(50)') cat1,
  t.v.value('c[2]/@category','varchar(50)') cat2,
  t.v.value('c[3]/@category','varchar(50)') cat3
from cte
cross apply xcat.nodes('root') t(v)

Привет, Алекс, кажется, синтаксическая ошибка для ;with cte as.... Management Studio указывает на наличие ошибки.

curious1 27.05.2019 21:58

Все еще есть сообщение об ошибке в Management Studio. Ошибка синтаксиса.

curious1 27.05.2019 22:07

какое сообщение?

Alex Kudryashev 27.05.2019 22:08

Сообщение 102, уровень 15, состояние 1, строка 14. Неверный синтаксис рядом с ')'.

curious1 27.05.2019 22:15

Спасибо за обновление. Пример работает, но результаты не такие, как я ожидал. Прошу прощения за то, что пост не достаточно ясен. Пожалуйста, смотрите мой обновленный пост.

curious1 27.05.2019 22:58

Алекс, я никогда не использовал предложенный вами подход. Быстрый вопрос: какова его производительность в случае большой таблицы (миллионы записей)?

curious1 27.05.2019 23:16

Другие вопросы по теме