2016-05-08 62 views
1

表中的行,有多個值查找具有相同價值觀的PostgreSQL

id|value 
--|------ 
1 |a 
1 |b 
2 |a 
2 |b 
3 |a 
3 |c 
4 |a 
5 |a 
5 |b 
... 

所以我怎樣才能選擇所有的ID已作爲 1相同的值的id? 我想應該是這樣的

id 
-- 
1 
2 
5 

回答

2

如果你想正是相同的值,你可以使用基於集合的方法:

select t.id 
from t join 
    t t1 
    on t.value = t1.value and t1.id = 1 
group by t.id 
having count(*) = (select count(*) from t where t.id = 1); 

假設沒有重複,這個計算的數量值與每個ID匹配,然後檢查是否有相同的數字。

我應該承認,在string_agg()做法也是優雅:

select id 
from (select id, string_agg(value, ',' order by value) as values, 
      max(case when id = 1 then string_agg(value, ',' order by value)) over() as values_1 
     from t 
     group by id 
    ) t 
where values = values_1; 
0

還使用數組:

SELECT id 
FROM (SELECT DISTINCT id FROM t ORDER BY 1) ids 
WHERE ARRAY(SELECT value FROM t WHERE id = ids.id ORDER BY 1) = 
     ARRAY(SELECT value FROM t WHERE id = 1 ORDER BY 1); 

這應該工作,即使對於重複和/或NULL值。