【发布时间】:2017-04-13 10:23:26
【问题描述】:
这是我的第一个问题,如有任何礼仪错误,我们深表歉意!
我有三个相关的表...
ID - 此表提供所有记录的可见 ID
PARENT_CHILD_RELATIONSHIP - 这会将父记录与其子记录链接
DETAILS - 提供所有记录的详细信息
样本数据
Table ID PARENT_CHILD_RELATIONSHIP DETAILS
Columns KEY|PROPER_ID PARENT_KEY|CHILD_KEY KEY|FIELD
1|P1 1|NULL 5|A
2|P2 2|5 5|C
3|P3 2|6 6|A
4|P4 3|7 6|D
5|C1 4|8 7|B
6|C2 4|9 7|C
7|C3 8|A
8|C4 8|C
9|C5 9|B
9|C
这是我的查询的简化示例:
SELECT DISTINCT I.PROPER_ID, CHILD_ID_A.PROPER_ID, CHILD_ID_B.PROPER_ID
FROM ID I
LEFT OUTER JOIN PARENT_CHILD_RELATIONSHIP PCR_A ON PCR_A.PARENT_KEY = I.KEY
LEFT OUTER JOIN DETAILS D_A ON D_A.KEY = PCR_A.CHILD_KEY
AND D_A.FIELD = ('A')
LEFT OUTER JOIN ID CHILD_ID_A ON CHILD_ID_A.KEY = DETAILS_A.KEY
LEFT OUTER JOIN PARENT_CHILD_RELATIONSHIP PCR_B ON PCR_B.PARENT_KEY = I.KEY
LEFT OUTER JOIN DETAILS D_B ON D_B.KEY = PCR_B.CHILD_KEY
AND D_B.FIELD = ('B')
LEFT OUTER JOIN ID CHILD_ID_B ON CHILD_ID_B.KEY = DETAILS_B.KEY
WHERE I.PROPER_ID IN('1', '2', '3', '4')
我想要返回第 1 列中(父)PROPER_ID 为 1、2、3、4 的所有记录。然后,在第 2 列中,我想返回子记录的正确 ID如果该记录在详细信息表中具有“A”。对于第 3 列,我想做与第 2 列相同的操作,但在 DETAILS 表中有一个带有“B”的子记录。
我可以看到 4 种可能的情况:
1.详细信息表中有 0 条带有“A”或“B”的子记录 - 在这种情况下,我想返回一行,其中仅包含 Parent Proper_ID 和后续 2 列中的空白。
2.详细信息表中有 1 个或多个带有“A”的子记录 - 在这种情况下,我想返回与子记录一样多的行。
3. 同上,但详细信息表中只有“B”。
4. 'A' 和 'B' 子记录都有 - 在这种情况下,如果每个都有一个,我想在同一行重新运行所有数据。
电流输出
I.PROPER_ID | CHILD_ID_A.PROPER_ID | CHILD_ID_B.PROPER_ID
P1 | NULL | NULL
P2 | C1 | NULL
P2 | C2 | NULL
P2 | NULL | NULL
P3 | NULL | C3
P3 | NULL | NULL
P4 | C4 | C5
P4 | C4 | NULL
P4 | NULL | C5
P4 | NULL | NULL
我想要的输出:
I.PROPER_ID | CHILD_ID_A.PROPER_ID | CHILD_ID_B.PROPER_ID
P1 | NULL | NULL
P2 | C1 | NULL
P2 | C2 | NULL
P3 | NULL | C3
P4 | C4 | C5
这甚至可能吗?我尝试了许多不同的变体并尝试搜索其他示例,但没有找到解决方案。
任何帮助将不胜感激!
【问题讨论】:
-
在您的问题中包含一些示例数据和预期输出会有所帮助;以及您当前查询的问题所在。
-
谢谢@alex-poole - 我已经添加了这些 - 希望不会太复杂
-
ID.PROPER_ID 是否与 ID.KEY 相同或其他?您发布的查询也没有始终使用别名,这有点令人困惑。是否只有一层亲子关系——没有孙子? (不知道为什么你有一个单独的父/子表,而不仅仅是 ID 中的父列......)
-
它们是两个不同的字段,PROPER_ID 仅存在于 ID 表中 - 也许值得我在示例数据中澄清,以便它显示正确的表内容?只有 1 级父/子。
-
是的,并确保查询和当前输出与样本数据匹配。真的在寻找an MCVE,因为我不确定我是否理解你想要做的事情的描述。