插入行后右外连接不起作用

时间:2019-10-31 18:00:04

标签: mysql right-join

我有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。

如果我现在将下面的行插入到CustomerManuals表中,则上述SQL将不起作用

客户手册(已插入行)

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

上面的sql现在只返回1行

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

请注意,在上表中,对CustomerManualsID为空的行已经消失。

是否可以显示客户拥有的所有手册以及他们没有的所有手册?

2 个答案:

答案 0 :(得分:0)

将条件放置在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

答案 1 :(得分:0)

扩大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