【问题标题】:Oracle SQL nested relationship into one levelOracle SQL 嵌套关系为一级
【发布时间】:2020-04-04 13:15:22
【问题描述】:
ColumnA ColumnB  ColumnC ColumnD
A        B        C        E
D        C        F        E
C        H        I        E
C        W        S        E1

逻辑应该是当columnA/columnB在columnC中有一条记录是columnA/columnB在另一条与columnD相同的记录中,输出如下

ColumnV  ColumnW
A          C
B          C
D          F
C          F
C          I
H          I
C          S
W          S
A          F
B          F
A          I
B          I 

我如何编写一个 sql 来获得以下内容:

【问题讨论】:

  • 似乎递归 CTE 只能使用一次 union all 不能使用两次
  • 在阅读您的问题时,我无法理解您的输入如何映射到您的输出。你能扩展你的逻辑吗?另外,你已经尝试过什么来解决这个问题?
  • 逻辑应该是当columnA/columnB在columnC中有一条记录是columnA/columnB在另一条记录中与columnD中的值相同
  • 当columnA/columnB在columnC中有一条记录是columnA/columnB在另一条记录中与columnD中的值相同,它将是columnV(columnA/columnB的值)和ColumnW(columnC的值) , 也请考虑循环直到没有更多子记录

标签: sql oracle hierarchical-data


【解决方案1】:

我不确定我是否完全理解您尝试实现的逻辑,但这里是创建您的表并复制您的示例输出的 SQL。在https://livesql.oracle.com上测试过

请对此持保留态度,因为如果您的数据可能有重复的行或循环或诸如此类的内容,而您的示例中没有说明,则查询可能需要修改。

大纲:

  1. 在“with”子句中,我们将“ColumnA”和“ColumnB”转为单个列,并添加 col_src 以保留新的“ColumnAB”是哪一个。

  2. 然后我们递归查询,通过匹配列 D 和与前一列 C 匹配的列 A/B 连接。

  3. 为了匹配提供的排序,我们按以下方式排序:

    • 递归级别
    • C 栏
    • 来源是 A 列还是 B 列
    • A 或 B 列的值
create table mytable as
select 'A' "ColumnA",'B' "ColumnB",'C' "ColumnC",'E' "ColumnD" from dual
union select 'D' "ColumnA",'C' "ColumnB",'F' "ColumnC",'E' "ColumnD" from dual
union select 'C' "ColumnA",'H' "ColumnB",'I' "ColumnC",'E' "ColumnD" from dual
union select 'C' "ColumnA",'W' "ColumnB",'S' "ColumnC",'E1' "ColumnD" from dual
;

with temp as (
    select "ColumnA" as "ColumnAB", "ColumnC", "ColumnD", 'A' as col_src
    from mytable
    union all select "ColumnB", "ColumnC", "ColumnD", 'B' as col_src
    from mytable
)
select connect_by_root("ColumnAB") "ColumnV", "ColumnC" as "ColumnW" from temp
connect by prior "ColumnD" = "ColumnD" and prior "ColumnC" = "ColumnAB"
order by level,"ColumnC",col_src,  "ColumnAB"

【讨论】:

  • sql也可以直接或间接显示关系吗? A - C 是直接的,A - I 是间接的?
  • @vllll 也许试试case when level > 1 then 'indirect' else 'direct' end这样的表达式。
猜你喜欢
  • 2011-12-17
  • 2013-10-14
  • 1970-01-01
  • 2013-05-27
  • 2014-10-27
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多