2015-01-23 2 views
0

Я пытаюсь получить список идентификаторов, содержащих идентификаторы всех родителей данной записи.Запрос на получение списка рекурсивно определенных родителей

Таблица: carrier_products (идентификатор, carrier_product_id)

Я до сих пор приходят с этим

carrier_products.id IN 
       (WITH RECURSIVE tree(id, carrier_product_id) AS (
        SELECT cp.id, cp.carrier_product_id FROM carrier_products cp WHERE cp.id = ? 
        UNION 
         SELECT cp.id, cp.carrier_product_id 
         FROM carrier_products cp JOIN tree ON cp.carrier_product_id = tree.id 
        ) 
        SELECT id FROM tree) 

, но это не работает правильно, любой совет?

+0

Можете ли вы создать sqlfiddle и изменить свой вопрос с желаемыми результатами? – Mihai

+0

Вы хотите, чтобы все родители или все предки? –

ответ

1

Вы должны быть осторожны с тем, что именно вы хотите получить. Здесь вам нужна таблица со всеми предками, поэтому в таблице, которую вы создаете с WITH RECURSIVE, должно быть только одно поле (id). Кроме того, будьте осторожны с конечным состоянием вашей рекурсии (тест значения null). Вот решение:

[email protected] testdb=# create table carrier_products(id integer unique not null, carrier_product_id integer); 
CREATE TABLE 
Temps : 33,361 ms 

[email protected] testdb=# insert into carrier_products(id, carrier_product_id) values (0, null); 
INSERT 0 1 
Temps : 3,005 ms 
[email protected] testdb=# insert into carrier_products(id, carrier_product_id) values (1, 0); 
INSERT 0 1 
Temps : 1,151 ms 
[email protected] testdb=# insert into carrier_products(id, carrier_product_id) values (2, 0); 
INSERT 0 1 
Temps : 0,978 ms 
[email protected] testdb=# insert into carrier_products(id, carrier_product_id) values (3, 1); 
INSERT 0 1 
Temps : 0,676 ms 
[email protected] testdb=# select * from carrier_products; 
id | carrier_product_id 
----+-------------------- 
    0 |    NULL 
    1 |     0 
    2 |     0 
    3 |     1 
(4 lignes) 

[email protected] testdb=# WITH RECURSIVE tree(id) AS (
    SELECT cp.carrier_product_id FROM carrier_products cp WHERE cp.id = 3 
    UNION 
    SELECT cp.carrier_product_id 
    FROM carrier_products cp JOIN tree ON cp.id = tree.id and cp.carrier_product_id is not null 
) 
SELECT id FROM tree; 

id 
---- 
    1 
    0 
+0

Работал отлично, очень ценился, но почему, но я указываю, что и cp.carrier_product_id не является нулевым. – Tarlen

+1

Нельзя иметь «нуль» в вашем результирующем наборе. –

Смежные вопросы