2016-04-26 52 views
0

我有一個表預訂像下面多個列一起在where子句

認購

user  user_id  cve_id   vulnerability_id  
------- ---------- ------------- ------------------- 
kumar 17   CVE-2016-3987 74     
rajesh 16   CVE-2016-3987 74    

我還有一個表像下面

APP_USER_ID  VULNERABILITY_ID  STATUS  
-------------- ------------------- --------- 
16    74     assigned 

我想以檢索所有訂閱該到目前爲止尚未分配給用戶。我嘗試了以下查詢

select * from subscription where user_id not in (select APP_USER_ID from app_user_subscription) 

但是,如果用戶匹配,它將跳過所有訂閱。我明白了爲什麼發生。因爲我只提到了user_id。我想跳過user_idcve_id。我如何更新我的查詢?

+0

什麼是具有點返回一個空值的行過濾未分配的人用戶標識和漏洞標識都出現在第二個表中?這看起來並不正常。 –

+0

@TimBiegeleisen訂閱表我上面提到的實際上是一個視圖。每當有另一個表中的更新時,我都需要不要在視圖中反映出來。這是我的目標。 – Rajesh

回答

1

使用的所有行會被返回的表一LEFT OUTER JOIN,你可以只使用一個WHERE條款

SELECT a.* FROM user u 
LEFT OUTER JOIN APP_USER_ID a on a.APP_USER_ID = u.user_id 
WHERE u.user_id IS NULL 
+0

太好了。簡單幹淨的答案。 – Rajesh

0
select * from subscription where (user_id,cve_id) not in (select APP_USER_ID,<corresponding column for cve_id> from app_user_subscription)