【问题标题】:How to associate rows based on key and previous key without multiple joins如何在没有多个连接的情况下根据键和前一个键关联行
【发布时间】:2021-12-11 14:14:02
【问题描述】:

我的表格中的数据如下所示:

ID previous_id value
01 NULL
02 01
03 02
04 03
.. ..

我想根据前一个 ID 等于该行 ID 的行的值来设置该行的值。例如,如果 ID = 04 的行的值为 1,我希望之前 ID = 04 的行也具有值 1,这反过来会导致之前 ID = 03 的行具有值 1 等等。

我没有固定的连接行数,ID 是 GUID。

有没有办法在不使用临时表的情况下执行这样的功能,它会检查先前 ID 等于行 ID 的行的值,然后根据同一列中的行值分配一个值.

我想象的递归逻辑的伪 SQL: 不存在的情况(前一个 ID 等于 ID 的行)然后 randomColumn else 前一个 id 行的值作为值结束

【问题讨论】:

  • 这听起来像 LAG 分析函数可能是你所追求的,或者可能是 FIRST_VALUELAST_VALUE 取决于。请编辑您的问题以包含实际数据以及预期输出。比如你说的1的值是从哪里来的?
  • PL/SQL 是编程语言。查询是 SQL。更新了问题和标签。

标签: sql oracle


【解决方案1】:

您可以使用一个简单的 JOIN 获得直接请求的结果:

select c.id, c.prev_id, p.val 
 from tbl c
 left join tbl p 
   on (c.prev_id = p.id) 
order by c.id;

Lead/Lag 函数失败是因为它们依赖于排序,没有什么可以保证您的数据中的排序作为 ID 是 GUID

但是,还有很多问题需要回答。你已经建立了层次关系,那么结果是否需要反映这种关系?有了一个分支并且 id:prev_id 被很好地排序,基本上不需要额外的工作。但是等级制度很少维持这样的秩序——它们往往会变得混乱。要解开它,您需要专门解决层次结构本身。实现这一点(在 Oracle 中)的最佳方法是使用 start with ... connect by ...(参见 Demo。两者都有)

select id
     , prev_id
     , (select val 
          from tbl t
         where t.id = h.prev_id
       ) 
  from (select id, prev_id
          from tbl 
        connect by prev_id = prior id 
          start with prev_id is null 
        ) h;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多