【问题标题】:Inner joins multiple tables内连接多个表
【发布时间】:2015-02-14 20:57:37
【问题描述】:
TableA:
+------+------+---------+
| A_Id | B_Id | AValue  |
+------+------+---------+

TableB:
+------+------+------+
| B_Id | A_Id | C_Id |
+------+------+------+

TableC:
+------+------+------+---------+
| C_Id | B_Id | D_Id | CValue  |
+------+------+------+---------+

TableD:
+------+---------+
| D_Id | DValue  |
+------+---------+

SELECT AValue, CValue, Dvalue
FROM TableA 
inner JOIN TableB
    ON TableA.A_Id = TableB.A_Id
inner JOIN TableC
    ON TableB.B_Id=TableC.B_Id;
inner JOIN TableD
    ON TableC.D_Id=TableD.D_Id;

但是,这并没有提供我需要的 DValue 列,而只是提供了 AValue 和 CValue 列。我需要所有三列。我该怎么做呢?

【问题讨论】:

  • 您的查询看起来没问题。
  • 为什么TableB 有一个C_IdTableC 有一个D_Id?这似乎是错误的。
  • 请使用示例数据和所需结果编辑您的问题。 SQL Fiddle 也很有帮助。
  • 如果TableD中有对应的DValue则显示。否则 INNER JOIN 将根本不返回任何行。只有 LEFT JOIN 可以返回 AValueCValue,但不能返回 DValue
  • 如果DVALUE 为NULL,我认为您会得到您报告的结果的唯一方法是。会是这样吗?

标签: sql oracle inner-join


【解决方案1】:

您的列键中有一些不合逻辑的内容。 TableC 和 TableB 包含 3 个映射键...虽然我不知道它们代表什么,但其中一些没有映射,也许你想试试

SELECT AValue, CValue, Dvalue
FROM TableA 
inner JOIN TableB using(B_Id)
inner JOIN TableC using(C_Id)
inner JOIN TableD using(D_Id)

【讨论】:

  • @BobJarvis 重新阅读 OP 的查询,您会注意到 C_Id 从未使用过。
  • @JeanFrançoisSavard - 我不确定这真的很重要(尽管 OP 的查询 可能 不正确)。根据 OP 的查询,似乎 A 和 B 是一对多的,B 和 C 是一对多的,D​​ 和 C 是一对多的(即 - D 中的一行与多行相关在 C)。在这些关系中不使用 C_ID。但是我还没有喝咖啡(但是谷仓里的小动物是靠上帝喂食的!:-) 所以我可能还没想清楚。 :-)
  • @BobJarvis 我同意,但是我只是想向 OP 展示一个也可以工作的不同查询。因为他的初始查询对我来说似乎没问题。无论如何,让我们拭目以待,看看 OP在我们喝咖啡时给出任何反馈:)
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 2020-06-19
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
相关资源
最近更新 更多