我有一个包含产品的表,每个产品都有用于制造的其他产品。用于制造母产品的产品也可以制造并包含其他制造产品。例子:
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)
1条答案
按热度按时间h5qlskok1#
您的查询是可以的,但是在实际数据的某个地方出现了一个循环,例如material1需要3,3需要8,8需要1。这样,查询将产生无限行,所以oracle报告会循环。您提供的示例数据中不存在此循环。
有几种方法可以处理循环,但在本例中,我怀疑您希望更正数据。您可以找到有问题的行,例如使用pseudocolumn
connect_by_is_cycle
:在这个dbfiddle中,你可以看到同样的错误,循环材料8。我添加了一行来模拟这种行为。
您也可以将rcte与以下条款一起使用:
如文件所述