好的,这是我的问题。假设客户可以访问 CustomerRegions 表中定义的多个区域:
CustomerRegionID | CustomerID | RegionID
----------------------------------------
1 | 1 | 1
2 | 1 | 2
假设客户 1 有三个用户 1、2 和 3。对于每个用户,我们可以通过表 UserRegions 指定他们可以访问哪些 CustomerRegions:
UserRegionID | UserID | CustomerRegionID
----------------------------------------
1 | 1 | 1
2 | 1 | 2
3 | 2 | 2
因此,用户 1 将有权访问 Customerregions,而用户 2 将只能访问 CustomerRegion 2。
如果为给定用户指定了 UserRegions,则只有那些 CustomerRegions 出现在结果集中,但如果没有为给定用户指定 UserRegions,则所有 CustomerRegions 都出现在结果中。我想获得给定客户的每个用户的所有可访问区域。我正在寻找的结果是这样的:
CustomerID | UserID | RegionID
------------------------------
1 | 1 | 1
1 | 1 | 2
1 | 2 | 2
1 | 3 | 1
1 | 3 | 2
我的问题是这可以在一个查询中完成吗?如何?
编辑:我似乎现在可以工作了:
SELECT CustomerID,
UserID,
RegionID
FROM users
LEFT JOIN customerregions ON customerregions.CustomerID = users.CustomerID
LEFT JOIN userregions ON userregions.UserID = users.UserID AND userregions.CustomerRegionID = customerregions.CustomerRegionID
LEFT JOIN regions ON regions.RegionID = customerregions.RegionID
WHERE (userregions.UserID IS NOT NULL
OR (SELECT COUNT(1) FROM userregions WHERE userregions.UserID = users.UserID) = 0)
AND CustomerID = 1
where 中的额外计数查询似乎可以解决问题。感谢@Pablo Martinez 的帮助。但是,如果有人知道更好的方法来做到这一点,请告诉我。