2013-02-10 2 views
0

У меня есть что-то вроде этого:присоединиться в рекурсивной с смежности

CREATE TABLE categories (
id varchar(250) PRIMARY KEY, 
name varchar(250) NOT NULL, 
parentid varchar(250) 
); 

CREATE TABLE products (
id varchar(250) PRIMARY KEY, 
name varchar(250) NOT NULL, 
price double precision, 
category varchar(250) NOT NULL 
); 

INSERT INTO categories VALUES ('1', 'Rack', ''); 
INSERT INTO categories VALUES ('2', 'Women', '1'); 
INSERT INTO categories VALUES ('3', 'Shorts', '2'); 

INSERT INTO products VALUES ('1', 'Jean', 2.99, '3'); 
INSERT INTO products VALUES ('2', 'Inflatable Boat', 5.99, '1'); 

Теперь, если бы я хотел, чтобы увидеть общую цену товаров для каждой категории, я мог бы сделать что-то вроде этого:

SELECT 
categories.name, 
SUM(products.price) AS CATPRICE 
FROM 
categories, 
products 
WHERE products.category = categories.id 
GROUP BY categories.name 
; 

который производит вывод:

name | catprice 
--------+---------- 
Rack |  5.99 
Shorts |  2.99 
(2 rows) 

Но обратите внимание, что «шорты» является предком «Rack». Я хочу, чтобы запрос, который будет производить такой вывод:

name | catprice 
--------+---------- 
Rack |  8.98 
(1 row) 

Так что все цены на продукцию складываются в корневой категории. В таблице категорий есть несколько категорий корней; для простоты было показано только одно.

Это то, что я до сих пор:

-- "nodes_cte" is the virtual table that is being created as the recursion continues 
-- The contents of the()s are the columns that are being built 
WITH RECURSIVE nodes_cte(name, id, parentid, depth, path) AS (
-- Base case? 
SELECT tn.name, tn.id, tn.parentid, 1::INT AS depth, tn.id::TEXT AS path FROM categories AS tn, products AS tn2 
LEFT OUTER JOIN categories ON tn2.CATEGORY = categories.ID 
WHERE tn.parentid IS NULL 
UNION ALL 
-- nth case 
SELECT c.name, c.id, c.parentid, p.depth + 1 AS depth, (p.path || '->' || c.id::TEXT) FROM nodes_cte AS p, categories AS c, products AS c2 
LEFT OUTER JOIN categories ON c2.CATEGORY = categories.ID 
WHERE c.parentid = p.id 
) 
SELECT * FROM nodes_cte AS n ORDER BY n.id ASC; 

Я понятия не имею, что я сделал неправильно. Вышеприведенный запрос возвращает нулевые результаты.

ответ

0

Ваш рекурсивный запрос отключен. Дайте это попробовать:

EDIT - Для того, чтобы сделать эту работу с SUM, используйте:

WITH RECURSIVE nodes_cte(name, id, id2, parentid, price) AS (
-- Base case? 
SELECT c.name, 
    c.id, 
    c.id id2, 
    c.parentid, 
    p.price 
FROM categories c 
    LEFT JOIN products p on c.id = p.category 
WHERE c.parentid = '' 
UNION ALL 
-- nth case 
SELECT n.name, 
    n.id, 
    c.id id2, 
    c.parentid, 
    p.price 
FROM nodes_cte n 
    JOIN categories c on n.id2 = c.parentid 
    LEFT JOIN products p on c.id = p.category 
) 
SELECT id, name, SUM(price) FROM nodes_cte GROUP BY id, name 

А вот Fiddle: http://sqlfiddle.com/#!1/7ac6d/19

удачи.

+0

Используя это, я смог добавить «p.price» и вывести итоговые цены за каждую категорию. Тем не менее, мне все равно нужно получить общее количество для корневой категории («Rack» в этом случае), и я не знаю, куда поставить SUM мне понадобится. – user2057674

+0

@ user2057674 - см. Правки - удачи! – sgeddes

+0

Ничего себе, спасибо! Да, мне это понадобится. – user2057674

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