2017-08-01 92 views
1

我想写一个SQL查询来找到管理员角色缺失的公司。以下是表格设计,因为公司2没有与其关联的管理员角色,所以查询应返回值2SQL查询找到缺失的角色

表信息 - 公司,CompanyRoleMapping(请假设公司3,4拥有所有的5个角色)

我尝试这个查询

Select Company.COMPANY_ID 
from Company inner join 
    CompanyRoleMapping 
    on Company.COMPANY_ID = CompanyRoleMapping.COMPANY_ID 
group by USER_ROLE 
having CompanyRoleMapping.USER_ROLE = 'admin' 

enter image description here

但它似乎没有不工作。能否请你帮我这个

回答

1

WHERE条款选择IDS

SELECT c.COMPANY_ID 
FROM company c 
WHERE c.COMPANY_ID NOT IN (SELECT crm.COMPANY_ID FROM CompanyRoleMapping crm WHERE crm.USER_ROLE = 'admin') 

公司

Company_ID 
1 
2 
3 
4 

CompanyRoleMapping

Company_id user_role 
1   admin 
1   manager 
1   employee 
1   client 
1   technician 
2   manager 
2   employee 
2   client 
2   technician 

输出

COMPANY_ID 
2 

SQL小提琴:http://sqlfiddle.com/#!9/c07c28/1/0

无子查询

SELECT c.COMPANY_ID 
FROM company c 
INNER JOIN CompanyRoleMapping crm ON c.COMPANY_ID != crm.COMPANY_ID and crm.USER_ROLE = 'admin' 

输出

COMPANY_ID 
2 

SQL小提琴:http://sqlfiddle.com/#!9/c07c28/5/0

+0

谢谢你非常努力,但有没有什么办法可以在不使用子查询的情况下获得它。否则,我将不得不采用建议的解决方案 –

+0

试试我的第二个解决方案 – Matt

+0

为什么你不能使用子查询? – JeffUK

0

可能这个SQL会更快的更大的表:

SELECT c.COMPANY_ID 
FROM Company AS c 
WHERE NOT EXISTS (
    SELECT 1 
    FROM CompanyRoleMapping AS r 
    WHERE c.COMPANY_ID = r.COMPANY_ID 
    AND r.USER_ROLE = 'admin' 
) 
+0

非常感谢您的努力,但有没有什么方法可以在不使用子查询的情况下获取它。?否则,我将不得不采用建议的解决方案 –

0

试试这个: -

SELECT C.* FROM Company C 
WHERE C.CompanyID NOT IN 
    (
    SELECT CRM.CompanyID FROM CompanyRoleMapping CRM 
    WHERE CRM.UserRole = 'admin' 
) 
+0

非常感谢您的努力,但有没有什么方法可以在不使用子查询的情况下获得它。否则,我将不得不采用建议的解决方案 –

0

你可以试试这个查询:

SELECT C.COMPANY_ID, GROUP_CONCAT(CM.USER_PROFILE) AS `profiles` FROM `Company` AS C INNER JOIN `CompanyRoleMapping` AS CM ON C.COMPANY_ID = CM.COMPANY_ID 
GROUP BY C.COMPANY_ID 
HAVING (CASE WHEN `profiles` NOT LIKE '%admin%' THEN 1 ELSE 0 END) = 1; 

SQL小提琴:http://sqlfiddle.com/#!9/6becc1/6