【问题标题】:Inner join 3 tables returns nothing内连接 3 个表不返回任何内容
【发布时间】:2015-06-22 18:02:27
【问题描述】:

有 3 张桌子。

CB 表

      CID   EC ID   Status  CType
      1001  1001    Active  1540
      1004  1001    Active  4

表 M

CID     EID        EC ID    EID-CID
1001      1166          1001    1166_1001
1001      1167a         1001    1167a_1001
1001      1167b         1001    1167b_1001
1001      1168          1001    1168_1001
2014.2071 1043          2018    1043_2014.2071
1004      1166          1001    1166_1004
1004      1167a         1001    1167a_1004
1004      1168          1001    1168_1004
1004      1167b         1001    1167b_1004

第三桌(CM)

EID           CID            EID-CID      EC ID          CType
1043    2014.2071     1043_2014.2071      2018            4

我正在尝试内部连接 ​​3 个表。我正在使用下面的查询(我参考了stackoverflow页面Inner Joining three tables) 我的查询没有返回任何内容。但没有给出任何错误信息。

SELECT 
  M.EID, 
  CB.CID, 
  M.[EID-CID], 
  CB.[CType],
  CB.[EC ID] 
FROM 
  (CB INNER JOIN M ON CB.CID = M.CID) 
  inner join CM on CM.CID=M.CID

结果应该是这样的

 CID        EID       EC ID EID-CID      CType
1001        1166    1001    1166_1001       1540
1001        1167a   1001    1167a_1001      1540
1001        1167b   1001    1167b_1001      1540
1001        1168    1001    1168_1001       1540
2014.2071    1043   2018    1043_2014.2071  5.5
1004        1166    1001    1166_1004        4
1004        1167a   1001    1167a_1004       4
1004        1168    1001    1168_1004        4
1004        1167b   1001    1167b_1004       4

【问题讨论】:

  • CM 表中唯一的 CID 的值为 2014.2071,该值与 M 表中的记录匹配,但与 CB 表中的记录不匹配,因此您没有得到任何结果。
  • 如果您希望从该查询中返回结果,您可能正在寻找Left join 而不是内部联接,如果不是两个您要加入的表中的一个。这将拉回您要加入的表的值,或者如果没有要拉回的值,它将改为拉回空值。不确定这是否是您要查找的内容,但似乎可能是这种情况。参考链接:w3schools.com/sql/sql_join.asp
  • 您实际上并没有从 CM 表中选择任何内容,您是否需要加入该表?您的架构/问题有点难以理解,因为您的表、它们的列和它们的数据之间似乎有很多重叠,而没有太多解释为什么。
  • @user254948 它返回所有行但 CType 列只有 5.5 个数据。

标签: sql ms-access-2010 inner-join


【解决方案1】:

当使用inner join 时,只会返回与连接条件匹配的结果。

  1. CB 表有两个 ID:1001, 1004
  2. M 表具有这两个 ID(将在查询的此时返回)
  3. CM 表中 没有 个来自 CB 的 ID。

在三个表之间执行inner join 会产生零结果应该如此

如果您删除CM 上的联接,您将获得与CB 中的两个ID 相关的结果,或者如果您要加入MCM您将拥有 2014.2071 行的表,但是在所有三个表中都没有记录。由于在所有三个表之间都使用了inner joins,因此您将收到应有的结果(基于您所写的内容),即零记录。

【讨论】:

    【解决方案2】:

    您对 CM 的加入加入了错误的列:您在 CID 上开玩笑,但您应该在 EID 上加入:

    SELECT M.EID, CB.CID, M.[EID-CID], CB.[CType],CB.[EC ID]
    FROM CB
    JOIN M ON CB.CID = M.CID
    JOIN CM ON CM.EID = M.EID -- change here
    

    删除了不必要的括号。

    【讨论】:

    • “错误的列”可能不准确;根据给定的模式和所有缩写,有点难以分辨:O 无论哪种方式,更改连接列看起来仍然会产生零结果,因为2014.2071 行将永远不会根据连接和数据返回CB和M
    【解决方案3】:

    内连接只返回匹配的结果。看起来你的连接类型搞砸了。 根据您所说的结果应该如何,我假设您正在寻找 LEFT 或 RIGHT JOIN。 例如

    SELECT 
    M.EID, CB.CID, M.[EID-CID], CB.[CType],CB.[EC ID] 
    FROM 
      (CB RIGHT JOIN M ON CB.CID = M.CID) LEFT JOIN CM  on CM.CID=M.CID
    

    您可能想看看这个网站: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-17
      • 2021-05-10
      • 2016-02-23
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2020-04-27
      • 2019-04-06
      相关资源
      最近更新 更多