2016-04-29 70 views
1

我有一個表的樣子:PostgreSQL的選擇

user key 
x  1 
x  2 
y  1 
z  1 

的問題很簡單。如何找出誰沒有密鑰2的用戶? 結果應該是y和z用戶。

回答

3

@ jarlh的回答可能是最快的,如果你有兩個表;
- 一個與用戶
- 一個與你的事實

select "users"."user_id" 
from "users" 
where not exists (select 1 from tablename t2 
        where t2."user_id" = "users"."user_id" 
        and t2."key" = 2) 

這就是結構我會建議過,有兩個表。

對於你的情況,如果你只有一個表,下面可能是一個更快的選擇;它不需要加入或運行相關的子查詢,而是隻掃描整個表一次。

SELECT 
    "user" 
FROM 
    tablename 
GROUP BY 
    "user" 
HAVING 
    MAX(CASE WHEN "key" = 2 THEN 1 ELSE 0 END) = 0 
+0

jarlh的回答不使用兩個表格。它只使用一個表。 –

+0

@a_horse_with_no_name:這是我的觀點,我不同意jarlh的答案是隻有一個表具有退化用戶維度的情況下最快的答案。 – MatBailie

+1

你的第二個查詢最後缺少'= 0'。 –

1

試試這個;

SELECT "user", "key" 
FROM Your_Table AS T1 
LEFT OUTER JOIN Your_Table AS T2 ON T1."user" = T2."user" AND T2."key" = 2 
WHERE T2."user" IS NULL 
2

返回用戶行,只要相同的用戶不具有鍵2.

select user, key 
from tablename t1 
where not exists (select 1 from tablename t2 
        where t2.user = t1.user 
        and t2.key = 2) 

注意user是ANSI SQL的保留字,所以你可能需要到另一行將其劃定爲"user"