可以在POSTGRESQL中使用以下条件进行递归查询吗?

时间:2020-10-12 09:54:08

标签: postgresql recursive-query

我的表格联系人中有一个层次结构。每个联系人都有与表contact_state(contact_id)相关的state_id列。 contact_state表中有一个is_top列。

我需要编写2个查询: 从contact_state is_top为false的联系人中递归选择COUNT所有子项(父列为parent_id)。因此,如果孩子的state_id.contact_state为false,那么我们需要在subchild.state_id.contact_state不为true的情况下寻找他的孩子。

对于此搜索,我使用以下查询:

with recursive hierarchy as (
select contact.id
from contacts contact join contact_state state1 on contact.state_id = state1.id and contact.parent_id = 45 and state1.is_top = false
union all
select recursive_contact.id
from contacts recursive_contact
inner join contact_state recursive_contact_state on recursive_contact.state_id = recursive_contact_state.id and recursive_contact_state.is_top = false inner join hierarchy on hierarchy.id = recursive_contact.parent_id
)
select count(*) from hierarchy;

但是我完全不知道该怎么做: 选择所有具有state_id.is_top = true的孩子+(以递归方式)进入所有具有state_id.is_top = false的孩子,直到不让拥有state_id.is_top = true的孩子(仅计数他们+带有state_id.is_top =的第一层深度的孩子)真正)? 有可能吗?

如果要简单得多,可以使用以下选项: (递归地)仅检查state_id.is_top = false的所有子级,直到不让state_id.is_top = true的子级(仅计数他们+ state_id.is_top = true的一级深度子级)? 我以后可以轻松添加的一级孩子

UPD

数据库scema:

CREATE TABLE contacts (
id INT PRIMARY KEY, 
name TEXT,
parent_id INT,
state_id INT
);
CREATE TABLE contact_state (
id INT PRIMARY KEY, 
name TEXT,
is_top BOOL
);

演示数据:

INSERT INTO contact_state VALUES(1, 'STATE #1', TRUE);
INSERT INTO contact_state VALUES(2, 'STATE #2', FALSE);
INSERT INTO contact_state VALUES(3, 'STATE #3', TRUE);
INSERT INTO contact_state VALUES(4, 'STATE #4', FALSE);

INSERT INTO contacts VALUES(1, 'A1', NULL, 2);
  INSERT INTO contacts VALUES(2, 'A2', 1, 1);
    INSERT INTO contacts VALUES(3, 'A3', 2, 2);
      INSERT INTO contacts VALUES(4, 'A4', 3, 3);

  INSERT INTO contacts VALUES(5, 'B2', 1, 4);
    INSERT INTO contacts VALUES(6, 'B3', 5, 2);
      INSERT INTO contacts VALUES(7, 'B4', 6, 1);
        INSERT INTO contacts VALUES(8, 'B5', 7, 3);

    INSERT INTO contacts VALUES(9,  'BB3', 5, 1);
      INSERT INTO contacts VALUES(10, 'BB4', 9, 1);

  INSERT INTO contacts VALUES(11, 'C2', 1, 4);
    INSERT INTO contacts VALUES(12, 'C3', 11, 3);

    INSERT INTO contacts VALUES(13, 'CC3', 11, 2);

  INSERT INTO contacts VALUES(14, 'D2', 1, 2);

  INSERT INTO contacts VALUES(15, 'E2', 1, 3);

预期输出: 5(如果使用计数)或ID:2、7、9、12、15

0 个答案:

没有答案