3

私はテーブルを持っていますUsers

テーブルもありますDepartments

と の間にマップ テーブルがUsersありDepartmentsます。

すべての部門に表示されるすべてのユーザーIDを検索したい。

たとえば、部門が 5 つあり、Paul が部門 #1 にしかいない場合、Paul は出力リストに含まれません。

彼は、すべての部門 (1..5) にリストされている場合にのみ、

一時テーブルを使用して非常に長い(非常に長い)ことを始めましたが、もっと良い方法があると思います。

Sql Fiddleも作成します。

4

6 に答える 6

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
  )

他にもいると思います。

于 2013-02-15T10:26:54.913 に答える
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 フィドル

于 2013-02-15T10:27:27.127 に答える
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

于 2013-02-15T10:22:15.387 に答える
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)
于 2013-02-15T10:26:37.957 に答える
0

以下のクエリを試してください。これが役立つかどうか教えてください

 select * from users where userid in
       (select userid from MapUserstoDepartments
       group by userid
        having count(userid) = 5)
于 2013-02-15T10:40:50.847 に答える
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

于 2013-02-15T10:19:16.003 に答える