Sql 选择记录的父项
我需要在select语句中附加一个新列。它保存父级的显示顺序 我目前有这个sql语句Sql 选择记录的父项,sql,oracle,Sql,Oracle,我需要在select语句中附加一个新列。它保存父级的显示顺序 我目前有这个sql语句 SELECT DISTINCT order_no, code, disp_order, lvl, description FROM tbl_pattern +----------+------+------------+-----+----------
SELECT DISTINCT order_no,
code,
disp_order,
lvl,
description
FROM tbl_pattern
+----------+------+------------+-----+-------------+
| order_no | code | disp_order | lvl | description |
+----------+------+------------+-----+-------------+
| RM001-01 | 1 | 0 | 1 | HK140904-1A |
| RM001-01 | 1 | 1 | 2 | HK140904-1B |
| RM001-01 | 1 | 2 | 3 | HK140904-1B |
| RM001-01 | 1 | 3 | 4 | HK140904-1C |
| RM001-01 | 1 | 4 | 5 | HK140904-1D |
| RM001-01 | 1 | 5 | 2 | HK140904-1E |
| RM001-01 | 1 | 6 | 3 | HK140904-1E |
| RM001-01 | 1 | 7 | 3 | HK140904-1X |
| RM001-01 | 1 | 8 | 4 | HK140904-1E |
| RM001-01 | 1 | 9 | 5 | HK140904-1E |
+----------+------+------------+-----+-------------+
表上不存在父列,但我希望获得高于当前记录级别的显示顺序
从示例表中,结果应如下所示:
+----------+------+------------+-----+-------------+--------+
| order_no | code | disp_order | lvl | description | parent |
+----------+------+------------+-----+-------------+--------+
| RM001-01 | 1 | 0 | 1 | HK140904-1A | |
| RM001-01 | 1 | 1 | 2 | HK140904-1B | 0 |
| RM001-01 | 1 | 2 | 3 | HK140904-1B | 1 |
| RM001-01 | 1 | 3 | 4 | HK140904-1C | 2 |
| RM001-01 | 1 | 4 | 5 | HK140904-1D | 3 |
| RM001-01 | 1 | 5 | 2 | HK140904-1E | 0 |
| RM001-01 | 1 | 6 | 3 | HK140904-1E | 5 |
| RM001-01 | 1 | 7 | 3 | HK140904-1X | 5 |
| RM001-01 | 1 | 8 | 4 | HK140904-1E | 7 |
| RM001-01 | 1 | 9 | 5 | HK140904-1E | 8 |
+----------+------+------------+-----+-------------+--------+
通过提供的样本层次结构表示数据:
1
└2
└3
└4
└5
└2
└3
└3
└4
└5
自行加入您的数据。正确的连接条件是最重要的部分。然后,如果存在多个匹配项,则仅使用row_number筛选具有最大显示顺序的行
自行加入您的数据。正确的连接条件是最重要的部分。然后,如果存在多个匹配项,则仅使用row_number筛选具有最大显示顺序的行
您可以使用相关子查询查找上一级别的最新显示顺序: Oracle 11g R2架构设置: 问题1:
您可以使用相关子查询查找上一级别的最新显示顺序: Oracle 11g R2架构设置: 问题1:
8号和9号订单应该在6号以下,你的订单在7号以下。但这是相当模糊的。如果7是9,8&9是7&8,那么数据就更有意义了。@PeterPaff更新了8,使8映射到6而不是7的父对象。然而,我看不出任何逻辑为什么9应该映射到8的父对象之外的任何对象。如果它映射到7,那么它的级别应该是4而不是5。将根据他们的数据查询OP。我甚至没有注意到这一点,但你是对的,这没有意义。@MT0我已经更新了我的示例数据。印刷错误。Sorry@gengencera已回滚到我的原始解决方案,该解决方案现在与您更新的预期结果相匹配。disp_order 8和9应在6以下,您的订单应在7以下。但这是相当模糊的。如果7是9,8&9是7&8,那么数据就更有意义了。@PeterPaff更新了8,使8映射到6而不是7的父对象。然而,我看不出任何逻辑为什么9应该映射到8的父对象之外的任何对象。如果它映射到7,那么它的级别应该是4而不是5。将根据他们的数据查询OP。我甚至没有注意到这一点,但你是对的,这没有意义。@MT0我已经更新了我的示例数据。印刷错误。Sorry@gengencera已回滚到我的原始解决方案,该解决方案现在与您更新的预期结果相匹配。disp_order 8和9应在6以下,您的订单应在7以下。但这是相当模糊的。如果7是9,8和9是7和8,那么数据会更有意义。disp_order 8和9应该在6以下,在7以下。但这是相当模糊的。如果7是9,8和9是7和8,那么数据会更有意义。你的数据没有多大意义。除了它的描述之外,没有任何东西说disp_order 8应该有6作为父项。为什么9映射为7的父项?它的级别为5,前面的级别4行的显示顺序为8,所以该行不应该是其父行吗?@gengencera您的数据表示可能应该显示显示顺序,而不是级别。这些级别是可视化的。你的数据没有多大意义。除了它的描述之外,没有任何东西说disp_order 8应该有6作为父项。为什么9映射为7的父项?它的级别为5,前面的级别4行的显示顺序为8,所以该行不应该是其父行吗?@gengencera您的数据表示可能应该显示显示顺序,而不是级别。这些级别以视觉方式表示。
select disp_order, lvl, description, parent
from (
select t1.*, t2.disp_order parent,
row_number() over (partition by t1.disp_order
order by t2.disp_order desc) rn
from tbl_pattern t1
left join tbl_pattern t2 on t2.lvl = t1.lvl - 1 and t2.disp_order < t1.disp_order)
where rn = 1
order by disp_order
CREATE TABLE tbl_pattern ( order_no, code, disp_order, lvl, description ) AS
SELECT 'RM001-01', 1, 0, 1, 'HK140904-1A' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 1, 2, 'HK140904-1B' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 2, 3, 'HK140904-1B' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 3, 4, 'HK140904-1C' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 4, 5, 'HK140904-1D' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 5, 2, 'HK140904-1E' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 6, 3, 'HK140904-1E' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 7, 3, 'HK140904-1X' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 8, 4, 'HK140904-1E' FROM DUAL UNION ALL
SELECT 'RM001-01', 1, 9, 5, 'HK140904-1E' FROM DUAL;
SELECT t.*,
( SELECT MAX( disp_order )
FROM tbl_pattern p
WHERE p.order_no = t.order_no
AND p.code = t.code
AND p.lvl = t.lvl - 1
AND p.disp_order < t.disp_order ) AS parent
FROM tbl_pattern t
| ORDER_NO | CODE | DISP_ORDER | LVL | DESCRIPTION | PARENT |
|----------|------|------------|-----|-------------|--------|
| RM001-01 | 1 | 0 | 1 | HK140904-1A | (null) |
| RM001-01 | 1 | 1 | 2 | HK140904-1B | 0 |
| RM001-01 | 1 | 2 | 3 | HK140904-1B | 1 |
| RM001-01 | 1 | 3 | 4 | HK140904-1C | 2 |
| RM001-01 | 1 | 4 | 5 | HK140904-1D | 3 |
| RM001-01 | 1 | 5 | 2 | HK140904-1E | 0 |
| RM001-01 | 1 | 6 | 3 | HK140904-1E | 5 |
| RM001-01 | 1 | 7 | 3 | HK140904-1X | 5 |
| RM001-01 | 1 | 8 | 4 | HK140904-1E | 7 |
| RM001-01 | 1 | 9 | 5 | HK140904-1E | 8 |