2015-03-25 68 views
1

我有兩個表:SQL:如何查詢在一個表中是否有記錄基於另一個表中的值

project_members: 
[project_id,user_id] 
1,1 
1,2 
2,1 

employees: 
[user_id] 
1 
2 
3 

我需要的是一個SQL語句,將列出所有PROJECT_ID的不都來自他們內部員工的user_id,以及他們缺少的後續user_id。由於創紀錄的不PROJECT_ID 1,並在其中USER_ID 3等等等等存在

[project_id, user_id] 
1,3 
2,2 
2,3 

所以結果將是什麼樣。

感謝您的任何/所有幫助搞清楚這一點。

回答

1

首先,您要生成project_membersemployees的所有組合。你可以使用CROSS JOIN來做到這一點。然後您可以使用NOT EXISTS來獲得所需的結果。

SQL Fiddle

SELECT 
    p.project_id, 
    e.user_id 
FROM(
    SELECT DISTINCT project_id FROM project_members 
)p 
CROSS JOIN employees e 
WHERE 
    NOT EXISTS(
     SELECT 1 FROM project_members 
     WHERE 
      project_id = p.project_id 
      AND user_id = e.user_id 
    ) 

您也可以爲project_members的生存確認時使用LEFT JOIN

SELECT 
    p.project_id, 
    e.user_id 
FROM(
    SELECT DISTINCT project_id FROM project_members 
)p 
CROSS JOIN employees e 
LEFT JOIN project_members pm 
    ON pm.project_id = p.project_id 
    AND pm.user_id = e.user_id 
WHERE 
    pm.project_id IS NULL 
1
//Filtering records which are not available in Project table. 
SELECT a.ProjectId, b.ProjectId, b.UserId 
FROM Project a 
RIGHT JOIN 
(
/* Here, all the projects will be linked to all the users. So, All users will be assigned to all the projects. */ 
SELECT DISTINCT a.ProjectId, b.UserId 
FROM Project a 
CROSS JOIN Users b 
) b ON a.ProjectId = b.ProjectId and a.UserId = b.UserId 
WHERE a.ProjectId IS NULL 
ORDER BY b.ProjectId 

INNER QUERY 
Project.Project_Id, Project.User_id, Employee.UserId 
1, 1, 1 
1, 1, 2 
1, 1, 3 
1, 2, 1 
1, 2, 2 
1, 2, 3 
2, 1, 1 
2, 1, 2 
2, 1, 3 

Distinct Project.Project_Id, Employee.UserId 
1, 1 
1, 2 
1, 3 
2, 1 
2, 2 
2, 3 

Outer query, taking records which are not available in Project table. 

Please let me know for any issues 
+0

請解釋一下你的答案簡短,使之更加有用。 – 2015-03-25 07:56:39

相關問題