名称之间的链接列表成一列

问题描述 投票:1回答:1

我目前有两个用于存储实体之间关系的表,如下所示:

Entity_Table:包含实体的名称和类型(mastersecondary

ENTITY_ID  |  ENTITY_NAME  |  ENTITY_TYPE
-----------------------------------------
1          |  'entity_1'   |  'master'
2          |  'entity_2'   |  'secondary'
3          |  'entity_3'   |  'secondary'
...

链接表:包含实体之间的关系信息

MASTER_ID  |  SECONDARY_ID
--------------------------
1          |  2
1          |  3
...

其他信息

  • 大约有约5000个实体,每个实体可以有几个链接,有些则没有链接
  • 这些表由外部c ++代码使用

我正在寻找的内容:该查询将以这种格式返回所有实体及其链接的实体:

ENTITY_ID  |  ENTITY_TYPE  |  ENTITY_LINKS
------------------------------------------
1          |  'master'     |  2,3
2          |  'secondary'  |  1
3          |  'secondary'  |  1
...

我尝试使用COALESCEJOIN收效甚微,关于如何实现这一点的任何想法?

链接列必须为“类似于csv”的格式,因此后面的c ++代码可以直接使用它,而无需大量的for循环或每个实体只有一个查询,这会大大降低速度。

如果您知道如何将其放入视图,视图也很好:)

谢谢!

sql sql-server tsql group-by coalesce
1个回答
0
投票

我认为这将为您提供所需的服务。这使用需要SQL Server 2017或更高版本的string_agg。如果您使用的是SQL Server的旧版本,则可以使用stufffor xml path(这就是我上面哈里所说的)。

select e.entity_id, e.entity_type, string_agg(l.secondary_id, ',') as data
from entity_table e
inner join links l on l.master_id = e.entity_id
group by e.entity_id, e.entity_type
union
select e.entity_id, e.entity_type, string_agg(l.master_id, ',') as data
from entity_table e
inner join links l on l.secondary_id = e.entity_id
group by e.entity_id, e.entity_type
© www.soinside.com 2019 - 2024. All rights reserved.