如何从产品或产品级别返回物料

doinxwow  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(281)

我有一个包含产品的表,每个产品都有用于制造的其他产品。用于制造母产品的产品也可以制造并包含其他制造产品。例子:

ID_PRODUCT_MATERIAL   PRODUCTION   ID_MATERIAL
1                     2            2
1                     2            3
1                     2            4
2                     1            9
2                     1            10
3                     1            8
8                     1            5

产品1需要产品2、3和4,但产品2和3也是制造出来的。产品2需要9和10,产品3需要8,最后产品8需要5。在本例中,我们有级别,产品1处于级别1,产品2、3和4处于级别2,产品8处于级别3。我尝试使用带有递归的层次结构来进行选择,但结果表明它不是一个完整的层次结构。select used DOWN返回以下错误:

SQL error: ORA-32044: Cycle detected when executing the recursive WITH query

WITH CTE (ID_PRODUCT_MATERIAL,PRODUCTION,ID_MATERIAL) AS (
  SELECT ID_PRODUCT_MATERIAL,
  PRODUCTION,
  ID_MATERIAL,
  FROM MATERIAL

  UNION ALL

  SELECT ID_PRODUCT_MATERIAL,
  M.PRODUCTION,
  M.ID_MATERIAL,
  FROM MATERIAL M
  INNER JOIN CTE C
  ON M.ID_PRODUCT_MATERIAL = C.ID_MATERIAL
  )
SELECT * FROM CTE;

id\U product\U material和id\U material列派生自products表。在这种情况下如何处理?以下是表格的结构:

CREATE TABLE PRODUCT(
  ID_PRODUCT NUMBER(6,0) PRIMARY KEY,
  NAME VARCHAR2(200),
  WEIGHT NUMBER(6,2),
  PRICE NUMBER(6,2)
 );

CREATE TABLE PRODUCTION(
  ID_PRODUCT_PRODUCTION NUMBER(6,0) PRIMARY KEY,
  PRODUCTION NUMBER(3,0),
  CONSTRAINT FK_PRODUCTIONPRODUCT FOREIGN KEY(ID_PRODUCT_PRODUCTION) REFERENCES PRODUCT(ID_PRODUCT)
 );

CREATE TABLE MATERIAL(
      ID_PRODUCT_MATERIAL NUMBER(6,0),
      PRODUCTION NUMBER(3,0),
      ID_MATERIAL NUMBER(6,0), 
      CONSTRAINT PK_MATERIAL PRIMARY KEY(ID_PRODUCT_MATERIAL, ID_MATERIAL),
      CONSTRAINT FK_PRODUCT FOREIGN KEY (ID_PRODUCT_MATERIAL) REFERENCES PRODUCT(ID_PRODUCT),
      CONSTRAINT FK_PRODUCTION FOREIGN KEY (ID_PRODUCT_MATERIAL) REFERENCES PRODUCTION(ID_PRODUCT_PRODUCTION),
      CONSTRAINT FK_PRODUCT2 FOREIGN KEY (ID_MATERIAL) REFERENCES PRODUCT(ID_PRODUCT)
     );

 INSERT INTO PRODUCT (ID_PRODUCT,NAME,WEIGHT,PRICE) VALUES (1,'PRODUCT A',10,5),
 (2,'PRODUCT B',10,5),
 (3,'PRODUCT C',10,5),
 (4,'PRODUCT D',10,5),
 (5,'PRODUCT E',10,5),
 (6,'PRODUCT F',10,5),
 (7,'PRODUCT G',10,5),
 (8,'PRODUCT H',10,5),
 (9,'PRODUCT I',10,5),
 (10,'PRODUCT J',10,5)

INSERT INTO PRODUCT (ID_PRODUCT_PRODUCTION,PRODUCTION) VALUES (1,2),
(2,1),
(3,1)

INSERT INTO MATERIAL (ID_PRODUCT_MATERIAL, PRODUCTION, ID_MATERIAL) VALUES (1,2,2),
(1,2,3),
(1,2,4),
(2,1,9),
(2,1,10),
(3,1,8)
h5qlskok

h5qlskok1#

您的查询是可以的,但是在实际数据的某个地方出现了一个循环,例如material1需要3,3需要8,8需要1。这样,查询将产生无限行,所以oracle报告会循环。您提供的示例数据中不存在此循环。
有几种方法可以处理循环,但在本例中,我怀疑您希望更正数据。您可以找到有问题的行,例如使用pseudocolumn connect_by_is_cycle :

select m.*, connect_by_iscycle
  from material m
  connect by nocycle prior id_material = id_product_material

在这个dbfiddle中,你可以看到同样的错误,循环材料8。我添加了一行来模拟这种行为。
您也可以将rcte与以下条款一起使用:

SEARCH DEPTH FIRST BY id SET order1
CYCLE id SET cycle TO 1 DEFAULT 0

如文件所述

相关问题