sql - 仅选择具有较低层次结构的值
问题描述
我有一个配置表 CONFIG_STUFF:
Table_name: varchar
Field_name: varchar
Parent_name: varchar
覆盖系统具有许多本质上是分层的、完全可定制的字段。
例子:
Table_Name Field_Name Parent_Name
Tab1 CostCenter Division
Tab2 Division null
Tab3 Division null
Tab4 Team CostCenter
我需要做的是确定这个层次结构中给定字段的级别,然后选择它的 table_name 和 field_name 以及它下面的所有内容,同时排除上面的那些
例如,对于“成本中心”,我会返回:
Table_Name Field_Name
Tab1 CostCenter
Tab4 Team
对于'Division',我会返回:
Table_Name Field_Name
Tab1 CostCenter
Tab2 Division
Tab3 Division
Tab4 Team
到目前为止,我已经尝试使用connect by
,但无法让它按我想要的方式工作。
有什么想法吗?
解决方案
你真的不需要知道你的起点的水平。您可以使用该start with
子句找出它下面的所有内容:
-- cte for your sample data
with config_stuff (table_name, field_name, parent_name) as (
select 'Tab1', 'CostCenter', 'Division' from dual
union all select 'Tab2', 'Division', null from dual
union all select 'Tab3', 'Division', null from dual
union all select 'Tab4', 'Team', 'CostCenter' from dual
)
-- actual query
select table_name, field_name
from config_stuff
start with field_name = 'CostCenter'
connect by parent_name = prior field_name;
TABLE_NAME FIELD_NAME
---------- ----------
Tab1 CostCenter
Tab4 Team
但是您的层次结构不是唯一的,因此除法的同一件事会重复,就像CostCenter
两个父行一样Division
。
select table_name, field_name
from config_stuff
start with field_name = 'Division'
connect by parent_name = prior field_name;
TABLE_NAME FIELD_NAME
---------- ----------
Tab2 Division
Tab1 CostCenter
Tab4 Team
Tab3 Division
Tab1 CostCenter
Tab4 Team
当然,您可以添加一个distinct
以消除重复项:
select distinct table_name, field_name
from config_stuff
start with field_name = 'Division'
connect by parent_name = prior field_name;
TABLE_NAME FIELD_NAME
---------- ----------
Tab4 Team
Tab2 Division
Tab3 Division
Tab1 CostCenter
但这可能表明存在数据问题,如果这是完全可定制的,那么您可能最终会出现循环(循环)。
推荐阅读
- emacs - 无法将#+TITLE 添加到 org 文件并导出到 org v9.1.9 上的 HTML
- python - 替换未知的先验组数 - 正则表达式 python
- path - Kubernetes 入口规范中的路径
- reactjs - React 服务器端渲染 - addEventListener
- .net - 请求不返回
- sql - 从数千个列表中提取 4 个不同项目的最大日期值
- javascript - Angularjs 选项卡仅适用于使用 ng-repeat 的唯一数组元素
- java - Java JPA 布尔字段数据库
- java - 如何从 Java 和 Selenium 中的元素列表中获取元素中的元素
- linux - 将目录/文件输入文本文件,然后显示早于某个日期的文件