使用数组列将表联接到自身吗?

时间:2018-06-23 03:12:07

标签: sql arrays postgresql join

我有一张桌子:

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并未使用这些索引。这意味着尽管上面的查询有效,但速度非常慢。

1 个答案:

答案 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);