仅返回源表中存在来自另一个表的每次迭代的结果

时间:2018-02-25 02:19:57

标签: sql sql-server

我正在使用具有以下两个Microsoft SQL表的应用程序:

 [1] gmp_0.5-13.1        xts_0.10-1          MTS_0.33            zoo_1.8-1          
 [5] tseries_0.10-42     forecast_8.2        gridExtra_2.3       magrittr_1.5       
 [9] readr_1.1.1         ggplot2_2.2.1       bindrcpp_0.2        data.table_1.10.4-3
[13] stringr_1.2.0       tidyr_0.7.2         dplyr_0.7.4        

对象访问表包含所有用户 - >公司 - >对象访问组合,公司表包含公司列表。用户可以访问多个公司中的对象。 CompanyID字段上的Companies表和Access表之间有一个FK。

示例数据如下所示:

Object Access
    UserID
    CompanyID
    ObjectID


Company
    CompanyID

我正在寻找一个只返回用户有权访问所有公司中对象的结果的查询。

因此上述数据的结果将是:

Object Access
    UserID    CompanyID    ObjectID
    Bob       ABC          Acct
    Bob       DEF          Acct
    Bob       ABC          Vend
    Dan       ABC          Acct


Company
    CompanyID
    ABC
    DEF

因为这是唯一的用户 - >所有公司都存在的对象分配。

基本上我试图弄清楚哪些用户可以访问所有公司中的对象(然后反过来查看哪些用户只能访问某些公司中的对象)

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

如果用户有权访问给定对象类型的所有公司,那么对象访问表中(UserIDObjectID)组合的记录数将等于公司数量公司表。因此,要获得所有这些组合,我们可以使用:

SELECT USERID, OBJECTID FROM OBJECTACCESS
GROUP BY USERID, OBJECTID
HAVING COUNT(DISTINCT COMPANYID) = (SELECT COUNT(*) FROM COMPANY);

答案 1 :(得分:0)

Select
    a.*,
    (select count(*) from company) as company_cnt
from
    object_access a
where
    company_cnt = (select count(*) from object_access b where b.UserID = a.UserID and b.ObjectID = :p_object_id)