2017-08-01 95 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