我有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为空的行已经消失。
是否可以显示客户拥有的所有手册以及他们没有的所有手册?
答案 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
答案 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