如何获得以下场景的完全匹配连接?

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 不存在于预期结果中。

以上是关于如何获得以下场景的完全匹配连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中进行完全外连接? [复制]

哈希完全外连接如何工作?

C# Linq 对重复值的完全外连接

如何连接匹配模式的行?

完全外连接不显示不匹配的行 - SQL

如何连接两个表以获得以下结果?