2012-12-05 7 views
0

我有以下的(刪節模式) - 3個表 - 用戶,工作,工作類型其中存在一種類型的記錄,但是其他SQL查找匹配不

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。

回答

1

您還沒有表明你正在使用的數據庫管理系統,但這裏有一些疑問,應該工作在幾乎任何:

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還提供了一個特殊的MINUSEXCEPT功能,您可以使用。這將是這個樣子:

SELECT user_id 
    FROM job 
WHERE job_type_id = 1 
MINUS       -- or EXCEPT 
SELECT user_id 
    FROM job 
WHERE job_type_id = 2 
; 
+0

我愛你給了我很多選擇這裏。萬分感謝。 –

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) 
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 
相關問題