У меня есть что-то вроде этого:присоединиться в рекурсивной с смежности
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;
Я понятия не имею, что я сделал неправильно. Вышеприведенный запрос возвращает нулевые результаты.
Используя это, я смог добавить «p.price» и вывести итоговые цены за каждую категорию. Тем не менее, мне все равно нужно получить общее количество для корневой категории («Rack» в этом случае), и я не знаю, куда поставить SUM мне понадобится. – user2057674
@ user2057674 - см. Правки - удачи! – sgeddes
Ничего себе, спасибо! Да, мне это понадобится. – user2057674