【问题标题】:Join a table to itself using an array column?使用数组列将表连接到自身?
【发布时间】:2018-06-23 03:12:07
【问题描述】:

我有一张桌子:

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 索引。然而不幸的是,postgres 在使用 ANY 时不使用这些索引。这意味着虽然上述查询有效,但速度非常慢。

【问题讨论】:

    标签: sql arrays postgresql join


    【解决方案1】:

    使用ANY 运算符:

    演示:http://www.sqlfiddle.com/#!17/2540d/1

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

    SELECT *
    FROM parent p
    JOIN child c
    ON c.id = any( p.child );
    
    | id | child | id |
    |----|-------|----|
    |  1 | 2,4,5 |  2 |
    |  1 | 2,4,5 |  4 |
    |  1 | 2,4,5 |  5 |
    

    此外还应为子项编制索引以及使用什么索引?

    是的 - 如果 children 表很大(超过数百/数千行)。

    CREATE INDEX some_name ON child( id )
    

    【讨论】:

      猜你喜欢
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      相关资源
      最近更新 更多