在结果的同一行中显示同一列和同一表的 3 个不同值
Posted
技术标签:
【中文标题】在结果的同一行中显示同一列和同一表的 3 个不同值【英文标题】:Show 3 different values of the same column and same table in the same row in results 【发布时间】:2019-05-27 18:54:25 【问题描述】:我的项目使用 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 中,category
列有 10 个类别值,但我只对三个类别(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
其中仅包含给定 id_of_Table_A 的 cat1。我希望有类似的东西:
1, cat1, cat2, cat3
如果表 C 中存在 cat1、cat2 和 cat3 对于表 A 中给定的 id 1
。
如果单个语句无法产生所需的结果,那么存储过程是可以的。
更新
在以下示例结果中,
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
基本上,表的关系形成一棵树。我希望在从根开始的非重叠路径上找到叶子为 cat1、cat2 和 cat3 的根(表 A)。
【问题讨论】:
样本数据最好使用DDL + DML。请edit您的问题包括它。更多详情,read this.where c.category = 'cat1'
表示你只对cat1
感兴趣。
这只是一个例子。我无法编写查询以在结果中生成 cat2 和 cat3。
【参考方案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)
【讨论】:
嗨,Alex,;with cte as...
似乎存在语法错误。 Management Studio 指示存在错误。
Management Studio 中仍然收到错误消息。语法错误。
消息是什么?
Msg 102,级别 15,状态 1,第 14 行。')' 附近的语法不正确。
感谢您的更新。示例正在运行,但结果不是我预期的。我很抱歉帖子不够清楚。请查看我更新的帖子。以上是关于在结果的同一行中显示同一列和同一表的 3 个不同值的主要内容,如果未能解决你的问题,请参考以下文章