Sql 如何通过仅提供父项名称来获取父项的子项和孙子项记录

Sql 如何通过仅提供父项名称来获取父项的子项和孙子项记录,sql,oracle,Sql,Oracle,我必须从父表和子表中获取子记录。如果有人熟悉BOM概念,ia表中的父项可以有多个子记录,其中一个子项也可以有多个子项,所有信息都保存在BOM表中。查询和结果如下所示 CREATE TABLE ITEM(ID, ITEM_NUMBER)' INSERT INTO ITEM VALUES (1, 'ITEM-A'); INSERT INTO ITEM VALUES (2, 'ITEM-A1'); INSERT INTO ITEM VALUES (3, 'ITEM-A2'); INSERT INTO

我必须从父表和子表中获取子记录。如果有人熟悉BOM概念,ia表中的父项可以有多个子记录,其中一个子项也可以有多个子项,所有信息都保存在BOM表中。查询和结果如下所示

CREATE TABLE ITEM(ID, ITEM_NUMBER)'

INSERT INTO ITEM VALUES (1, 'ITEM-A');
INSERT INTO ITEM VALUES (2, 'ITEM-A1');
INSERT INTO ITEM VALUES (3, 'ITEM-A2');
INSERT INTO ITEM VALUES (4, 'ITEM-A2');
INSERT INTO ITEM VALUES (5, 'ITEM-A2-1');
INSERT INTO ITEM VALUES (6, 'ITEM-A2-2');


CREATE TABLE BOM(ID, PARENT_ITEM, COMPONENT);

INSERT INTO BOM VALUES (1, 1, 2);
INSERT INTO BOM VALUES (2, 1, 3);
INSERT INTO BOM VALUES (3, 1, 4);
INSERT INTO BOM VALUES (4, 2, 5);
INSERT INTO BOM VALUES (5, 2, 6);


SELECT ia.ITEM_NUMBER PARENT_ITEM, ic.ITEM_NUMBER COMPONENT
FROM BOM
INNER JOIN AGILE.ITEM ia ON BOM.ITEM = ia.id
INNER JOIN AGILE.ITEM ic ON ic.id = BOM.COMPONENT
WHERE ia.ITEM_NUMBER = 'ITEM-A'
此查询将返回如下结果

PARENT_ITEM      COMPONENT
ITEM-A           ITEM-A1
ITEM-A           ITEM-A2
ITEM-A           ITEM-A3
我想要的是,如果假设ITEM-A2有两个子记录,那么我尝试构建的查询应该返回类似这样的记录

PARENT_ITEM      COMPONENT
ITEM-A           ITEM-A1
ITEM-A           ITEM-A2
ITEM-A           ITEM-A3
ITEM-A2          ITEM-A2-1
ITEM-A2          ITEM-A2-2

看起来您需要此分层查询:

select ii.item_number, ic.item_number 
  from bom 
  join item ii on ii.id = bom.parent_item
  join item ic on ic.id = bom.component
  connect by prior component = parent_item
  start with parent_item = (select id from item where item_number = 'ITEM-A')

你想要什么还不是很清楚。请提供与预期数据对应的输入数据。这是否回答了您的问题?如果这只针对直系子女,您可以。1.创建子查询,在其中执行自联接并获取子查询2。与您的查询联合provided@AaronDietz我已经去过那个职位了,但在我的职业生涯中并没有很好的结束case@lukaszberwid我想在where子句中提供'ITEM-A'的名称,它应该获得该级别下的所有家庭记录。在这种情况下,所有5行这正是我需要的,但有一个小故障,你可能也能够解决。如果我在查询中放入两个项目编号,如父项目=从“项目-A”、“项目-A2”中项目编号所在的项目中选择id,则会给出一个错误。ORA-01427:单行子查询返回多行问题是我从另一个团队获得了项目编号,我们不知道哪个父项目也被用作另一行中的子项目,因此在这种情况下,我可能会得到两个项目编号“item-A”和“item-A2”,所以在这种情况下,查询也应该只给我5行。简言之,它应该忽略这些值。我相信这可以通过distinct实现,但首先必须消除此错误。对于返回两行的查询,不能使用=。用于两次:在“项目-A”、“项目-A2”中选择项目编号所在项目id中的父项目