我有一张桌子:
id integer
status_id integer
children integer[]
我该如何编写查询以将表与子表本身连接起来,并找到所有记录(所有子项的状态均为status_id 2)且项目的状态为1?
此外,应该为孩子建立索引并使用什么索引?
编辑:基于 krokodilko 答案,我认为查询可能是:
SELECT id
FROM (
SELECT p.id, p.status_id, every(c.status_id = 2) AS all_children_status_2
FROM positions p
JOIN positions c
ON c.id = ANY (p.children)
GROUP BY p.id, p.status_id
) sub
WHERE all_children_status_2 IS TRUE AND status_id = 1;
编辑2: 请注意,我在阅读中发现数组列应使用GIN或GIST索引。但是,不幸的是,在使用ANY时,postgres并未使用这些索引。这意味着尽管上面的查询有效,但速度非常慢。
答案 0 :(得分:1)
使用ANY运算符:
演示:http://www.sqlfiddle.com/#!17/2540d/1
# Deletes a dashboard iff the user is an admin user
def delete(self, idno):
cred = self.get_me();
if cred['access_role'] == 'adm':
print 'Dashboard successfully deleted!'
return api.Dashboard.delete(idno);
else:
print 'Not authorized to delete this Dashboard!'
return api.Dashboard.get(idno);
export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"
export ANDROID_HOME="/usr/local/share/android-sdk"
export PATH="$HOME/.composer/vendor/bin:/Users/Shared/Utils/Composer/bin:/Users/Shared/Utils/Scripts:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH"
此外,应该为孩子建立索引并使用什么索引?
是-如果子表很大(超过几百/几千行)。
CREATE TABLE parent(
id int,
child int[]
);
INSERT INTO parent VALUES(1, '{2,4,5}');
CREATE TABLE child(
id int
);
INSERT INTO child VALUES (1),(2),(3),(4),(5);