【发布时间】:2021-10-07 13:28:22
【问题描述】:
我有一张表 A、B 和 C,其中包含很多列 (30+)。所有的主要列是Id,RefNumber
我还有表 LinkedEntity 可以匹配来自不同表的记录(A、B 或 C)
我需要从表 A 中选择所有记录并显示来自 B 和 C 的链接记录
一个
| Id | RefNumber | OtherColumns |
|---|---|---|
| 101 | A101 | ... |
| 102 | A102 | ... |
B
| Id | RefNumber | OtherColumns |
|---|---|---|
| 201 | B101 | ... |
| 202 | B102 | ... |
C
| Id | RefNumber | OtherColumns |
|---|---|---|
| 301 | C101 | ... |
| 302 | C102 | ... |
关联实体
| Id | EntityId | LinkedEntityId |
|---|---|---|
| 1 | 101 | 202 |
| 2 | 102 | 301 |
| 3 | 102 | 201 |
| 4 | 102 | 202 |
预期结果:
| Id | RefNumber | LinkedB | LinkedBRefNumb | LinkedC | LinkedCRefNumb |
|---|---|---|---|---|---|
| 101 | A101 | 202 | B102 | NULL | NULL |
| 102 | A102 | 201,202 | B101,B102 | 301 | C101 |
第一个想法写类似的东西
SELECT A.Id, A.RefNumber, L1.Id, L1.RefNumber, L2.Id, L2.RefNumber
FROM A
LEFT JOIN (SELECT B.Id, B.RefNumber, le.EntityId, le.LinkedEntityId FROM B JOIN LinkedEntity le ON le.EntityId = B.Id OR le.LinkedEntityId = B.Id) L1
ON A.Id = L1.EntityId OR A.Id = L1.LinkedEntityId
LEFT JOIN (SELECT C.Id, C.RefNumber, le.EntityId, le.LinkedEntityId FROM C JOIN LinkedEntity le ON le.EntityId = C.Id OR le.LinkedEntityId = C.Id) L2
ON A.Id = L2.EntityId OR A.Id = L2.LinkedEntityId
但此查询返回 A 表的重复记录。
有什么方法可以删除重复项并加入linkedEntities 的值? (也许使用STRING_AGG)?
【问题讨论】:
-
STRING_AGG会起作用,但您将要编写 很多 的STRING_AGG表达式; 1 代表表B和C中的每一列。 -
鉴于您的示例数据,我不明白 thise 连接是如何工作的。第 2 行的
LinkedB是如何变成102的,为什么不是LinkedBRefNumbB101, B102?LinkedC如何加入? -
@Charlieface 抱歉,我的错……添加了额外的单元格……已修复
-
嗯 - 似乎您在表之间人为地划分(或假设)ID 值,使得 ID 201(作为示例)仅存在于一个表中。你确定这个假设永远不会被违反吗?让我们补充一下 - 为什么不使用常规交集表?
-
@SM 或者是的,我确信 id 会有所不同(在实时数据库中它更复杂......有额外的标志来确保 id 是我需要的)......你在常规下是什么意思路口?
标签: sql sql-server