SQL从给定的零件清单中创建完整的零件清单(迭代)

时间:2019-04-20 15:22:03

标签: sql postgresql iteration

我的SQL讲座中的给定任务有问题。 在该任务中,有一个数据库,其中列出了三个机器人的零件清单以及另一个清单,这些零件与第一个清单中的零件(如果它们是其他零件组成)相链接。

可以通过以下方式生成数据库:

CREATE TABLE part (
part_id BIGINT PRIMARY KEY,
part_namevarchar(64)NOTNULL
);

CREATE TABLE part_part (
    object_id BIGINT,
    part_id BIGINT,
    quantity INT NOT NULL,
    PRIMARY KEY(object_id, part_id)
);
ALTER TABLE part_part
 ADD CONSTRAINT part_id_fkey FOREIGNKEY (part_id) REFERENCES part(part_id)
 ON UPDATE CASCADE ON DELETE CASCADE;

 ALTER TABLE part_part
 ADD CONSTRAINT object_id_fkey FOREIGN KEY(object_id)REFERENCES part(part_id)
 ON UPDATE CASCADE ONDELETE CASCADE;

 INSERT INTO part(part_id, part_name)
 VALUES
 (0,'CPU A'),
 (1,'Cables'),
 (2,'Motherboard 3xy'),
 (3,'Motor ayX'),
 (4,'Arm'),
 (5,'Body'),
 (6,'Leg'),
 (7,'Wheel'),
 (8,'Motherboard 7ax'),
 (9,'Joint'),
 (10,'Motor Z1238'),
 (11,'Hammer'),
 (12,'Screw A'),
 (13,'Screw B'),
 (14,'Screw C'),
 (15,'Robo 1000'),
 (16,'CPU B'),
 (17,'CPU C'),
 (18,'Robo 2000'),
 (19,'Screwdriver'),
 (20,'Robo 3000');

 INSERT INTO part_part
 (object_id, part_id, quantity)
 VALUES
 (5,2,1),
 (5,0,1),
 (5,3,2),
 (5,1,5),
 (5,12,3),
 (4,9,3),
 (4,10,3),
 (4,13,13),
 (6,3,2),
 (6,7,4),
 (15,4,2),
 (15,11,2),
 (15,5,1),
 (15,6,1),
 (18,4,2),
 (18,11,2),
 (18,5,1),
 (18,6,2),
 (18,16,1),
 (20,4,3),
 (20,11,1),
 (20,19,1),
 (20,5,1),
 (20,6,1),
 (20,16,1),
 (20,17,1);

现在的任务是获取“机器人3000”所需的所有零件和子零件的清单及其数量。

我得到了:

WITH part2(part_name1, subpart_id, top_quantity, top_part_id, part_name) AS(
  WITH part1(part_name, subpart_id, quantity) AS(
  WITH subpart1(object_id, subpart_id, quantity) AS(SELECT * FROM part_part)
  SELECT part_name, subpart_id, quantity FROM subpart1
    JOIN part ON part.part_id = subpart1.object_id
     WHERE part_name = 'Robo 3000'
  )
  SELECT * FROM part1
  JOIN part ON part1.subpart_id = part.part_id
)
SELECT * FROM part2
JOIN part_part ON part2.top_part_id = part_part.object_id
ORDER BY top_part_id;

哪给我一个仅列出子零件的列表(机器人中所有零件的零件,它们本身就需要零件),并且也没有考虑如果零件被多次使用,这里的手臂被使用了3次,但是它的份数不乘以数量。

这也是有限的,因为它只查看给定的部分和补给的部分,如果需要的话则不会更深。

是否有一种方法可以遍历所有部分并将它们放入SQL的大列表中?

例如java方法与自调用方法的相同方式?

1 个答案:

答案 0 :(得分:1)

PostgreSQL支持recursive sQL,这可能是解决问题的一种方法。以下是使用您的数据的示例。

long int