0

我有以下(精简架构) - 3 个表 - 用户、作业、作业类型

TABLE: job_type
COLUMN: job_type_id
1           
2

TABLE: user
COLUMN: user_id
101
102
103

TABLE: job
COLUMNS: job_id | user_id | job_type_id
              4 |     101 |           1
              5 |     101 |           2
              6 |     102 |           1
              7 |     103 |           2

我想编写一个查询,返回所有在 job_type_id = 1 的工作表中有工作的用户,但如果他们也有 job_type_id = 2 的工作,则将它们从结果中排除。因此,目标结果集应该只返回用户 102。

4

3 回答 3

2
select *
  from user u
 where exists (select * from job j
                where j.user_id=u.user_id
                  and j.job_type_id=1)
   and not exists (select * from job j
                    where j.user_id=u.user_id
                      and j.job_type_id=2)
于 2012-12-05T20:11:24.200 回答
1

您还没有说明您正在使用什么 DBMS,但这里有一些几乎可以在任何情况下使用的查询:

SELECT DISTINCT user_id
  FROM job j1
 WHERE job_type_id = 1
   AND NOT EXISTS
        ( SELECT 1
            FROM job j2
           WHERE job_type_id = 2
             AND j2.user_id = j1.user_id
        )
;

SELECT DISTINCT user_id
  FROM job
 WHERE job_type_id = 1
   AND user_id NOT IN
        ( SELECT DISTINCT user_id
            FROM job
           WHERE job_type_id = 2
        )
;

SELECT DISTINCT j1.user_id
  FROM job j1
  LEFT
 OUTER
  JOIN job j2
    ON j1.user_id = j2.user_id
   AND j1.job_type_id = 1
   AND j2.job_type_id = 2
 WHERE j2.user_id IS NULL
;

一些 DBMS 还提供您可以使用的特殊MINUS功能EXCEPT。看起来像这样:

SELECT user_id
  FROM job
 WHERE job_type_id = 1
MINUS                          -- or EXCEPT
SELECT user_id
  FROM job
 WHERE job_type_id = 2
;
于 2012-12-05T20:14:07.697 回答
0

尝试:

Select * from
user U inner join Job J
on 
  J.user_id = U.user_id
inner join job_type T
on 
  T.job_type_id = 1
Where 
T.job_type_id <> 2
于 2012-12-05T20:14:39.900 回答