我想根据列的值从 Oracle DB 中检索记录。我怎么做..?
我需要根据同一个表中的“是子项目”列值来选择项目 ID。我想获取所有可能的最高级别项目的项目 ID:如果当前记录是子项,则为父项 ID,如果当前记录没有父项,则应返回自身 ID。
我正在使用 Oracle SQL Developer 18.2。
| Project ID | Is Child Project | Parent Project ID |
+------------+------------------+-------------------+
| 101 | Yes | 501 |
| 102 | No | - |
| 201 | No | - |
| 202 | Yes | 502 |
| 501 | No | - |
| 502 | No | - |
+------------+------------------+-------------------+
I expect to get relevant Project ID i.e. if Project is Child then I should get 'Parent Project ID' else just 'Project ID', meaning that
包含主键 id 列以及作为表自身主键的外键的另一列的表称为邻接表。
在您引用的示例中,没有必要使用“is_child_project”列,因为该信息是多余的。父列中值的存在是对行是否是层次结构的顶级问题的逻辑答案。
Oracle 有一些专有的 SQL 结构来帮助针对邻接列表编写有用的查询。我在您提供的行中添加了更多行,并更新了 501 和 502 的父项目以显示层次结构的更多深度。
COLUMN p_id_hierarchy FORMAT a14
COLUMN parent_project_id FORMAT a17
COLUMN top_level_project FORMAT a17
WITH ald( project_id, parent_project_id ) AS (--adjacency list data
SELECT '101', '501' FROM DUAL UNION ALL
SELECT '102', NULL FROM DUAL UNION ALL
SELECT '201', NULL FROM DUAL UNION ALL
SELECT '202', '502' FROM DUAL UNION ALL
SELECT '501', '003' FROM DUAL UNION ALL
SELECT '502', '002' FROM DUAL UNION ALL
SELECT '003', '001' FROM DUAL UNION ALL
SELECT '002', '001' FROM DUAL UNION ALL
SELECT '001', NULL FROM DUAL
)
SELECT LPAD(project_id, LENGTH(project_id) + LEVEL - 1, ' ') AS p_id_hierarchy,
parent_project_id,
CONNECT_BY_ROOT project_id AS top_level_project
FROM ald
CONNECT BY parent_project_id = PRIOR project_id
START WITH parent_project_id IS NULL
;
从您所写的内容来看,您的要求似乎是了解邻接列表中任何层次结构的顶级(根)。CONNECT_BY_ROOT 运算符将为您提供此信息。
P_ID_HIERARCHY PARENT_PROJECT_ID TOP_LEVEL_PROJECT
-------------- ----------------- -----------------
001 001
002 001 001
502 002 001
202 502 001
003 001 001
501 003 001
101 501 001
102 102
201 201
9 rows selected.
需要明确的是,CONNECT BY、STARTS WITH 和 CONNECT_BY_ROOT 操作是特定于 Oracle 的。如果您想研究一种更与 RDBMS 无关的方法,您将需要研究主题“递归公用表表达式”。这是一种执行分层查询的符合 SQL-ANSI 的方法——并且在 Oracle 中也可用。
分层查询不是一个简单的学习主题。我花了相当长的时间练习它们来建立扎实的理解。祝你好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句