2016-12-14 59 views
2

我有表表-A與下面的列Postgres的匹配所有數組值與同一列和條件---更新

id event_id 
1 101 
1 102 
1 103 
2 105 
2 103 
2 106 

I和搜索(101,103)與和類似於查詢與OR條件條件

例如id 1匹配101和103 event_id;

爲此我寫下面的查詢,但它不工作。

select * from table_a where event_id = ALL(ARRAY[101,103]); 

修訂--------------------------- 我有一個問題

讓說ID是另一個表event_categories具有像這樣的關係的外國人。

id  parent_id 
101  null 
102  101 
103  101 
104  null 
105  104 

所以我想基於並與父事件類別,或在該父的子事件類別來從表-A記錄。

例如101,104用AND 102,103內的101

+0

如果您有新問題,請提出一個新問題(並將其中一個答案標記爲已接受,以便將此問題標記爲已解決) –

+0

@a_horse_with_no_name添加了新的問題[鏈接](htt p://stackoverflow.com/questions/41260956/postgres-match-all-array-values-to-same-column-with-and-condition) –

回答

1

您需要聚合爲單個ID的所有event_ids:

select id 
from table_a 
group by id 
having array_agg(event_id) @> array[101,103]; 

@>是contains操作符,因此它檢查所有event_ids的數組是否包含具有這兩個ID的數組。

這將返回任何具有至少兩個事件101和103(這是你問你的問題)的ID。

如果你想找到那些有正好這兩個event_ids(其中您的樣本數據中不包含)的ID,你可以使用:

select id 
from table_a 
group by id 
having array_agg(distinct event_id order by event_id) = array[101,103]; 

注意,數組中的元素的順序(不像「包含」@>運營商)

+0

感謝您的詳細解釋。 –

1

,或者使用HAVING子句:

SELECT t.id 
FROM YourTable 
WHERE event_id IN(101,103) 
GROUP BY t.id 
HAVING COUNT(distinct event_id) = 2 
+0

它工作正常。感謝sagi。 –

相關問題