如何获得以下场景的完全匹配连接?
Posted
技术标签:
【中文标题】如何获得以下场景的完全匹配连接?【英文标题】:How can I get the exact match join for the below scenario? 【发布时间】:2010-09-02 16:49:08 【问题描述】:如何加入下表
TableA TableB TableC TableD
ID ID_C ID ID_A Value ID ID ID_C Value
1 1 1 1 a 1 1 1 a
2 1 b 2 1 b
为了得到像这样的结果
Result
ID ID_B Value ID_C ID_D Value
1 1 a 1 1 a
1 2 b 1 2 b
我的结果不应该包含 1 2 b 1 1 b 并且两个值列不能总是具有相同的值,因此它不能在条件中使用。
为了更简单,
Resultant Table TableA TableB
ID Value ID Value ID ID_A
1 a 1 a 1 1
1 b 2 g 2 1
2 a 3 d 3 2
3 c 4 3
现在我需要将结果表与 TableA、TableB 连接起来,以便从 TableA、TableB 和 ResultantTable.ID=TableA.ID 和 TableB.ID_A=TableA.ID 中获取一些列,因为它是一个外键。
使用 TableB 进行连接会导致重复。由于 ID=1 出现两次,当只有 2 条记录时,我得到 4 条 ID=1 的记录。它可以通过 distinct 或 group by 来完成,但我还需要显示其他列。在此过程中我该如何做。
【问题讨论】:
@kurozakura -“结果不应包含 1 2 b 1 1 b”。它应该包含 1 2 b 1 1 a 吗?如果没有,为什么不呢? 好吧,这就是表格的样子,值 a 和 b 就像不同的状态,我需要检索这两个状态,因此从表 c -> 表 d 映射,因为表 b 和表 D 它最终导致不正确的映射,因为每条记录可以有多个状态,即 a , b 。 啊,所以TableB应该通过Value链接到TableD。 @kurozakura,在“简化”场景中,您无法从 TableA 和 TableB 中获取结果表。结果值 b 和 c 不存在于 TableA 或 TableB 中,而 TableA 值 g 和 d 不存在于预期结果中。 【参考方案1】:SELECT A.ID, B.ID, B.Value, C.ID, D.ID, D.Value
FROM TableA A
INNER JOIN TableB B ON A.ID = B.ID_A
INNER JOIN TableC C ON A.ID_C = C.ID
INNER JOIN TableD D ON B.ID = D.ID AND C.ID = D.ID_C
【讨论】:
B.ID 和 D.ID 并不总是相等的。 一个案例说明将有助于包含在您的示例数据和结果中。【参考方案2】:您告诉我们TableB中的字段“value”应该与TableD中的字段“value”不一样?我们可以用 B.Value = D.Value 替换 B.ID = D.ID 来解决您的问题吗?
你确定,这就是假定的工作方式吗?
【讨论】:
【参考方案3】:试试:
SELECT A.ID, B.ID ID_B, B.Value Value_B, C.ID ID_C, D.ID ID_D, D.Value Value_D
FROM TableA A
JOIN TableB B ON A.ID = B.ID_A
JOIN TableC C ON A.ID_C = C.ID
JOIN TableD D ON B.Value = D.Value AND C.ID = D.ID_C
【讨论】:
我认为表格没有正确规范化 @kurozakura,在“简化”场景中,您无法从 TableA 和 TableB 中获取结果表。结果值 b 和 c 不存在于 TableA 或 TableB 中,而 TableA 值 g 和 d 不存在于预期结果中。以上是关于如何获得以下场景的完全匹配连接?的主要内容,如果未能解决你的问题,请参考以下文章