如果不存在子集,则选择全部,否则选择子集

Posted

技术标签:

【中文标题】如果不存在子集,则选择全部,否则选择子集【英文标题】:Select all if no subset is present, otherwise select subset 【发布时间】:2012-07-03 19:20:25 【问题描述】:

好的,这是我的问题。假设客户可以访问 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 的帮助。但是,如果有人知道更好的方法,请告诉我。

【问题讨论】:

表结构好混乱 【参考方案1】:

我不同意@diEcho,表结构很混乱

你尝试过加入吗?

Select CustomerID, UserID, RegionID 
    from UserRegions join CustomerRegion 
         on  CustomerRegion.CustomerRegionID=UserRegions.CustomerRegionID  
    where customerID=1

【讨论】:

是的,我已经尝试过了,但这只是解决方案的一部分。这为用户 1 和 2 提供了可访问的区域,但用户 3 被排除在外。未指定用户区域的用户应有权访问所有客户区域。 然后使用表用户的 OUTHER JOIN(左或右,取决于)来选择所有用户。没有用户区域的用户将为 NULL

以上是关于如果不存在子集,则选择全部,否则选择子集的主要内容,如果未能解决你的问题,请参考以下文章

特征选择常用算法

Leetcode78. Subsets(求集合的子集问题)

如果配置存在则选择第一行,否则选择 NULL Row

疏浚中的子集 (MuMIn) - 如果存在主效应,则必须包括交互作用

真子集和子集如何判断?

SQL:单个人存在多个地址。如果存在则选择当前地址,否则选择永久地址