【问题标题】:How to get parent's child and grandchild records by providing parent name only如何通过仅提供父母姓名来获取父母的子孙记录
【发布时间】:2020-03-06 05:36:57
【问题描述】:

我必须从父子表中获取子记录。如果有人熟悉 ia 表中的 BOM 概念 Parent Item 可以有许多子记录,其中一个子项也可以有多个子项,所有信息都保存在 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 有 2 个子记录,那么我正在尝试构建的查询应该返回类似这样的记录

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

【问题讨论】:

  • 不是很清楚你想要什么。请提供与预期数据相对应的输入数据。
  • 这能回答你的问题吗? Recursion In Oracle
  • 如果这仅适用于直系子女,您可以。 1. 创建子查询,您可以在其中执行自连接并获取子查询 2. 与您提供的查询联合
  • @AaronDietz 我已经看过那篇文章,但在我的情况下并没有很好地结束
  • @lukaszberwid 我想在 where 子句中提供“ITEM-A”的名称,它应该将所有家庭记录都放在第 n 级。在这种情况下,所有 5 行

标签: sql oracle


【解决方案1】:

看起来你需要这个分层查询:

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')

dbfiddle

【讨论】:

  • 这正是我所需要的,但您也可以解决一个小故障。如果我像parent_item = (select id from item where item_number IN ('ITEM-A', 'ITEM-A2')) 这样在查询中输入 2 个项目编号,它会给我一个错误。 ORA-01427: single-row subquery returns more than one row
  • 问题是我从另一个团队获得项目编号,我们不知道哪个父项目也被用作另一行中的子项目,所以在这种情况下,我可能会得到 2 个项目编号“项目” -A' 和 'ITEM-A2' 所以在这种情况下查询也应该只给我 5 行。简而言之,它应该忽略这些值。
  • 我确信这可以通过 distinct 来实现,但首先这个错误必须消失。
  • 您不能使用= 进行返回两行的查询。使用in 两次:parent_item in (select id from item where item_number IN ('ITEM-A', 'ITEM-A2'))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2021-09-19
  • 1970-01-01
  • 2021-05-25
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多