【问题标题】:Right Outer Join does not work after inserting row插入行后右外连接不起作用
【发布时间】:2019-10-31 18:00:04
【问题描述】:

我有 2 个包含以下数据的表

ManualVersions - 所有手册版本的列表

+------------------+---------------+--------------+
|Id   | ManualID   | VersionNumber |  VersionName |
+-----+------------+---------------+--------------+
|10   |   12       |   1.0         |   Version 1  |
|17   |   12       |   2.0         |   Version 2  |

CustomersManuals - 这让我知道哪些客户可以访问哪些手册版本

+---+---------------+--------------------+
|Id | CustomerID    |  ManualVersionsID  |
+-- +---------------+--------------------+
|4  | 19            |     10             |
|8  | 24            |     10             |

目标是编写一个查询,让我知道客户可以访问哪些手动版本,哪些没有访问权限。

为此,我在上述表格上运行以下 sql。

Select CustomersManuals.id as CustomerManualsID, ManualVersions.VersionNumber, ManualVersions.VersionName, ManualVersions.id as ManualVersionID
FROM CustomersManuals
RIGHT OUTER JOIN ManualVersions ON CustomersManuals.ManualVersionsID = ManualVersions.id
WHERE (CustomersManuals.CustomerID=24 OR CustomersManuals.CustomerID iS NULL) AND ManualVersions.ManualID = 12

上述 SQL 的结果

+-------------------+--------------+---------------+----------------+
|CustomerManualsID  | VersionNumber| VersionName   | ManualVersionID|
+-------------------+--------------+---------------+----------------+
| 8                 | 1.0          | Version 1     | 10             |
| NULL              | 2.0          | Version 2     | 17             |

以上是正确的,并且做我想要的。返回 Null,表明 customerID 24 没有手册 2。

如果我现在将以下行插入到 CustomersManuals 表中,上述 SQL 将不起作用

CustomersManuals(插入第 i 行)

+----+------------+------------------+
| Id | CustomerID | ManualVersionsID |
+----+------------+------------------+
|30  | 18         | 17               |

上面的sql现在只返回1行

+-------------------+---------------+---------------+---------------------+
| CustomerManualsID | VersionNumber | VersionName   |   ManualVersionID   |
+-------------------+---------------+---------------+---------------------+
|  8                |  1.0          | Version 1     |   10                |

请注意,上表中针对 CustomerManualsID 为 null 的行已消失。

有没有办法显示客户拥有和没有的所有手册?

【问题讨论】:

  • 顺便说一句,没有人使用过RIGHT [OUTER] JOIN,而是更喜欢它更直观的对应物。
  • 了解 LEFT/RIGHT JOIN ON 返回的内容:INNER JOIN ON 行 UNION 由 NULL 扩展的所有不匹配的左/右表行。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 LEFT/RIGHT JOIN ON 删除任何由 NULL 扩展的行之后,需要右/左 [sic] 表列不为 NULL 的 WHERE 或 INNER JOIN ON,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER加入”。你有那个。 PS 对于代码问题,请给minimal reproducible example
  • 这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 这能回答你的问题吗? Right Join not returning all expected rows

标签: mysql right-join


【解决方案1】:

将子表的条件放在ON 子句中,而不是WHERE。那么你就不需要显式测试NULL

Select CustomersManuals.id as CustomerManualsID, ManualVersions.VersionNumber, ManualVersions.VersionName, ManualVersions.id as ManualVersionID
FROM CustomersManuals
RIGHT OUTER JOIN ManualVersions ON CustomersManuals.ManualVersionsID = ManualVersions.id AND CustomersManuals.CustomerID=24
WHERE ManualVersions.ManualID = 12

DEMO

【讨论】:

    【解决方案2】:

    增加 Barmar 的答案,写这个会更常见......

    Select m.id CustomerManualsID
         , v.VersionNumber
         , v.VersionName
         , v.id ManualVersionID
      FROM ManualVersions v
      LEFT
      JOIN CustomersManuals m 
        ON m.ManualVersionsID = v.id 
       AND m.CustomerID = 24
     WHERE v.ManualID = 12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多