Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带邻接的递归内连接_Sql_Postgresql_Recursion_Hierarchical Data_Addition - Fatal编程技术网

Sql 带邻接的递归内连接

Sql 带邻接的递归内连接,sql,postgresql,recursion,hierarchical-data,addition,Sql,Postgresql,Recursion,Hierarchical Data,Addition,我有这样的想法: 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 N

我有这样的想法:

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   |     8.98
(1 row)
现在,如果我想查看每个类别产品的总价格,我可以这样做:

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   |     8.98
(1 row)
它产生输出:

  name  | catprice
--------+----------
 Rack   |     5.99
 Shorts |     2.99
(2 rows)
但请注意,“Shorts”是“Rack”的前身。我想要一个能产生如下输出的查询:

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

我不知道我做错了什么。上面的查询返回零结果。

您的递归查询稍微关闭了一点。尝试一下:

编辑--要使之与总和一起工作,请使用以下命令:

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
这是小提琴:


祝你好运。

使用此功能,我可以添加“p.price”并再次提取每个类别的价格总计。然而,我仍然需要得到根类别的总数(在本例中为“Rack”),我不知道我将需要的总数放在哪里。