2013-02-15 37 views
3

我有表Users查找出現在SQL服務器中所有部門的所有用戶?

我也有表Departments

我有UsersDepartments之間的映射表。

我想找到的所有用戶標識出現在所有部門。

例如,如果有5個部門,Paul只在部門#1中,所以Paul不會出現在輸出列表中。

他會的,只有當他在各部門(1..5)上市

我開始使用臨時表做一些事情,這是非常長(readly長),我認爲有一個更好的辦法。

我也創建了一個Sql Fiddle

回答

1

有多種方法可以做到這一點。

您可以要求用戶在部門的數量等於部門總數:

SELECT 
    * 
FROM 
    Users 
    INNER JOIN 
    (
     SELECT userId, COUNT(*) c FROM MapUserstoDepartments 
     GROUP BY userId 
     HAVING COUNT(*) = (SELECT COUNT(*) FROM Departments) 
    ) UsersInAllDepartments 
    ON Users.userId = UsersInAllDepartments.userId 

你可能需要從各部門的列表中刪除用戶的部門留下任何:

SELECT * 
FROM Users 
WHERE NOT EXISTS 
    (
    SELECT depId FROM Departments 
    EXCEPT 
    SELECT depId FROM MapUserstoDepartments WHERE userId = Users.userId 
) 

我確定還有其他人。

0

這是你想要的嗎?

Select Tbl.userID , Tbl.username from (Select u.userid , u.username , 
count(u.userid) as Count from MapUsersToDepartments m 
inner join Users u on m.UserID = u.userID 
group by u.userid , u.username)Tbl 
where Tbl.Count = (Select count(*) from Departments) 

這裏是小提琴

http://sqlfiddle.com/#!3/5a960/53

1

試試這個

SELECT u.userId, u.UserName 
FROM MapUserstoDepartments m INNER JOIN 
    Users u ON u.userId = m.userId 
GROUP BY u.userId, u.UserName 
HAVING COUNT(m.depId) = (SELECT COUNT(*) FROM Departments) 

這將產生

| USERID | USERNAME | 
--------------------- 
| 100 |  John | 

而且sqlfiddle

0
select 
    Users.userId, 
    count(Departments.depId), 
    count(MapUserstoDepartments.userId) 

from 
    Users 
    left join MapUserstoDepartments on MapUserstoDepartments.userId = Users.userId 
    left join Departments on Departments.depId = MapUserstoDepartments.depId 


group by 
    Users.userId 

having 
    (SELECT COUNT(*) from Departments) = count(MapUserstoDepartments.userId) 
1

你可以這樣說:

select u.* 
from Users u 
where not exists 
(
    select 1 
    from Departments d 
    where not exists 
    ( 
     select 1 
     from MapUserstoDepartments m 
     where d.depId = m.depId 
     and  m.userId = u.userId 
    ) 
) 

SQL Fiddle

0

可以嘗試下面的查詢。讓我知道這是否會有所幫助

select * from users where userid in 
     (select userid from MapUserstoDepartments 
     group by userid 
     having count(userid) = 5) 
相關問題