【发布时间】: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