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
表中的行,有多個值查找具有相同價值觀的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
如果你想正是相同的值,你可以使用基於集合的方法:
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;
還使用數組:
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值。