Oracle 自连接多个可能的列匹配 - CONNECT BY?

2024-01-04

我有一个来自 ---- 的查询需求。尝试解决它CONNECT BY,但似乎无法得到我需要的结果。


表(简化):

create table CSS.USER_DESC (
    USER_ID          VARCHAR2(30) not null,
    NEW_USER_ID      VARCHAR2(30),
    GLOBAL_HR_ID     CHAR(8)
)

-- USER_ID       is the primary key
-- NEW_USER_ID   is a self-referencing key
-- GLOBAL_HR_ID  is an ID field from another system

用户数据(数据源)有两个来源......更新信息时我必须注意其中任何一个的错误。


应用场景:

  1. 为用户提供一个新的用户 ID...旧记录被相应设置并停用(通常是为成为全职承包商的重命名)
  2. 用户离开并稍后返回。 HR 未能向我们发送旧的用户 ID,因此我们无法连接帐户。
  3. 系统出了问题,没有在旧记录上设置新的用户 ID。
  4. 数据可能会以其他一百种方式变得糟糕


我需要知道以下是同一用户,并且我不能依赖名称或其他字段...它们在匹配记录之间有所不同:

ROOTUSER    NUMROOTS   NODELEVEL  ISLEAF    USER_ID    NEW_USER_ID  GLOBAL_HR_ID   USERTYPE      LAST_NAME         FIRST_NAME  
-----------------------------------------------------------------------------------------------------------------------------
EX0T1100    2          1          0         EX0T1100   EX000005                    CONTRACTOR    VON DER HAAVEN    VERONICA    
EX0T1100    2          2          1         EX000005                00126121       EMPLOYEE      HAAVEN, VON DER   VERONICA    
GL110456    1          1          1         GL110456                00126121       EMPLOYEE      VONDERHAAVEN      VERONICA    


EXOT1100 and EX000005正确连接的NEW_USER_ID场地。重命名发生在全球 HR ID 出现之前,因此EX0T1100没有。EX000005获得了新的用户 ID“GL110456”,并且两者仅通过具有相同的全局 HR ID 才能连接。

清理数据不是一个选择。


到目前为止的查询:

select connect_by_root cud.user_id RootUser, 
       count(connect_by_root cud.user_id) over (partition by connect_by_root cud.user_id) NumRoots, 
       level NodeLevel, connect_by_isleaf IsLeaf, --connect_by_iscycle IsCycle,
       cud.user_id, cud.new_user_id, cud.global_hr_id,
       cud.user_type_code UserType, ccud.last_name, cud.first_name
from   css.user_desc cud
where  cud.user_id in ('EX000005','EX0T1100','GL110456')
-- Using this so I don't get sub-users in my list of root users...
-- It complicates the matches with GLOBAL_HR_ID, however
start with cud.user_id not in (select cudsub.new_user_id 
                               from   css.user_desc cudsub 
                               where  cudsub.new_user_id is not null)
connect by nocycle (prior new_user_id = user_id);


我尝试过各种CONNECT BY条款,但没有一个是完全正确的:

-- As a multiple CONNECT BY
connect by nocycle (prior global_hr_id = global_hr_id)
connect by nocycle (prior new_user_id  = user_id)

-- As a compound CONNECT BY
connect by nocycle ((prior new_user_id = user_id)
                     or (prior global_hr_id = global_hr_id 
                         and user_id != prior user_Id))


UNIONing 两个 CONNECT BY 查询不起作用...我没有得到平衡。

这是我想看到的...我可以接受必须区分并用作子查询的结果集。我也同意 ROOTUSER 列中三个用户 ID 中的任何一个...我只需要知道它们是相同的用户。

ROOTUSER    NUMROOTS   NODELEVEL  ISLEAF    USER_ID    NEW_USER_ID  GLOBAL_HR_ID   USERTYPE      LAST_NAME         FIRST_NAME  
-----------------------------------------------------------------------------------------------------------------------------
EX0T1100    3          1          0         EX0T1100   EX000005                    CONTRACTOR    VON DER HAAVEN    VERONICA    
EX0T1100    3          2          1         EX000005                00126121       EMPLOYEE      HAAVEN, VON DER   VERONICA    
EX0T1100    3         (2 or 3)    1         GL110456                00126121       EMPLOYEE      VONDERHAAVEN      VERONICA    


Ideas?


Update

尼古拉斯,你的代码看起来非常像正确的轨道......目前,lead(user_id) over (partition by global_hr_id)global_hr_id一片空白。例如:

USER_ID   NEW_USER_ID   CHAINNEWUSER   GLOBAL_HR_ID   LAST_NAME   FIRST_NAME
FP004468                FP004469                      AARON       TIMOTHY
FP004469                                              FOONG       KOK WAH

我经常想将空值视为分区中的单独记录,但我从未找到一种方法ignore nulls工作。这做了我想要的:

decode(global_hr_id,null,null,lead(cud.user_id ignore nulls) over (partition by global_hr_id order by user_id)

...但必须有更好的方法。我还无法完成对完整用户数据(大约 40,000 个用户)的查询。两个都global_hr_id and new_user_id已编入索引。


Update

查询在大约 750 秒后返回......虽然很长,但可以管理。它返回 93k 记录,因为我没有一个好的方法来过滤根中的 2 级命中 - 你有start with global_hr_id is null,但不幸的是,情况并非总是如此。我将不得不更多地考虑如何过滤掉这些内容。

我之前尝试过添加更复杂的 start with 子句,但我发现它们单独运行 .

再次感谢您的帮助...正在努力解决这个问题。


您仅为一名用户提供了数据样本。多一点会更好。无论如何,让我们看看这样的事情。

SQL> with user_desc(USER_ID, NEW_USER_ID,  GLOBAL_HR_ID)as(
  2    select 'EX0T1100',  'EX000005',  null          from dual union all
  3    select 'EX000005',   null,       00126121      from dual union all
  4    select 'GL110456',   null,       00126121      from dual
  5  )
  6  select connect_by_root(user_id) rootuser
  7       , count(connect_by_root(user_id)) over(partition by connect_by_root(user_id)) numroot
  8       , level nodlevel
  9       , connect_by_isleaf
 10       , user_id
 11       , new_user_id
 12       , global_hr_id
 13    from (select user_id
 14               , coalesce(new_user_id, usr) new_user_id1
 15               , new_user_id
 16               , global_hr_id
 17            from ( select user_id
 18                        , new_user_id
 19                        , global_hr_id
 20                        , decode(global_hr_id,null,null,lead(user_id) over (partition by global_hr_id order by user_id)) usr
 21                    from user_desc
 22                 )
 23         )
 24  start with global_hr_id is null
 25  connect by prior new_user_id1 = user_id
 26  ;

Result:

ROOTUSER    NUMROOT   NODLEVEL CONNECT_BY_ISLEAF USER_ID  NEW_USER_ID GLOBAL_HR_ID
-------- ---------- ---------- ----------------- -------- ----------- ------------
EX0T1100          3          1                 0 EX0T1100 EX000005    
EX0T1100          3          2                 0 EX000005                   126121
EX0T1100          3          3                 1 GL110456                   126121
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 自连接多个可能的列匹配 - CONNECT BY? 的相关文章

随机推荐

  • Python 中的子进程 Popen 和 PIPE

    以下代码打印一个空行作为输出 该输出为 false 问题不在于权限 因为我使用 pdf 文件的 777 权限测试了该命令 如何修复该命令以提供正确的输出 import subprocess from subprocess import PI
  • 如何为所有子域设置 Git 配置选项?

    与您可以设置的方式类似特定 URL 的 Git 配置选项 https stackoverflow com a 23807432 1233435 like git config http https code example com sslV
  • 如何禁用 Android Lollipop 波纹的 alpha 值?

    我有一个使用自定义颜色的波纹 然而 颜色永远不会完全不透明 根据来自的回答Ripple 的颜色应该是什么 colorPrimary 或 colorAccent 材料设计 https stackoverflow com questions 2
  • 使用 @Query 在 intellij 中进行语言注入

    使用intellij idea 2016 3 4 是否可以根据参数注入语言 考虑一下这个 Query nativeQuery true value select from Foo List
  • 无法添加文件 iOS 应用程序包

    我添加了一个带有扩展名的空文件 js在资源路径中 但未添加到应用程序的捆绑包中 我确信我已添加到应用程序目标 但有时它包含在捆绑包中 有时它不包含在捆绑包中 我通过以下代码获取文件的内容 NSString filePath NSBundle
  • 测试不同客户端和服务器版本的最佳 Git 策略

    我希望能够为 Java 客户端 服务器运行集成测试 使用嵌入式 jetty 此外 我希望能够在集成测试期间混合搭配不同的服务器和客户端源代码版本 我想知道实现此目的的最佳 git 或 maven 版本策略是什么 客户端和服务器使用相同的 g
  • 如何使用 C# 安全地将数据保存到现有文件?

    如何安全地将数据保存到 C 中已存在的文件中 我有一些数据被序列化到文件中 我很确定直接安全到文件不是一个好主意 因为如果出现任何问题 文件将被损坏 并且以前的版本将丢失 这就是我到目前为止一直在做的事情 string tempFile P
  • webpacker:安装后应用程序中的页面开始加载很长时间

    我正在将 webpacker 安装到我的 Rails 应用程序中 安装后 我注意到应用程序中的页面开始加载很长时间 会发生什么情况 从日志 Completed 200 OK in 90075ms Views 90072 2ms Active
  • 为什么服务器和小型/大型机以及混合核心需要不同的 CPU 架构? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在从数据库获取设置的函数上,我遇到了错误[重复]

    这个问题在这里已经有答案了 我正忙于从数据库获取设置的函数 突然 我遇到了这个错误 Fatal error Call to a member function bind param on boolean in C xampp2 htdocs
  • 如何使用 css 禁用图像的颜色?

    这是一个小问题 如果您访问 www thumbtack com jobs 然后转到他们的赞助商 您可以看到 一开始您看不到赞助商名称中的颜色 但是当您将鼠标悬停在它们上方时 您可以看到颜色出现 有人可以告诉我该怎么做吗 我不太确定在谷歌上搜
  • 有没有工具可以将 CIL 编译为二进制文件?

    看了之前的帖子后 使使用 NET 语言编写的应用程序在旧机器上运行 https stackoverflow com questions 335450 making applications programmed in net languag
  • Firebase 云消息传递是免费的吗?

    我需要在我的应用程序中实现推送通知功能 探索一些选择 谷歌最近推荐了Firebase平台 但这并不是完全免费的服务 于是我又想到了使用GCM 谷歌将来会停止对 GCM 的支持吗 Firebase 云消息传递 https firebase g
  • java gson在序列化时替换密码值

    如何替换密码字段的值XXX使用 Gson 反序列化对象时 我找到了这个帖子 Gson 如何在没有注释的情况下从序列化中排除特定字段 https stackoverflow com questions 4802887 gson how to
  • 无法发送多种类型“|”通过 iOS 访问 Google Places API

    不知何故 我无法通过 iOS 将以下字符串发送到 Google Places API NSString string https maps googleapis com maps api place nearbysearch json lo
  • 如何存储对象数组?

    我有一个对象image我可以做类似的事情image top它会返回一个值 或者我可以这样做image myPoints 0 left它会返回一个值 我基本上有一个为我存储值的图像对象 我希望能够放置多个image数组中的对象 所以我可以做这
  • 无法在 RStudio 中启动 SparkR

    经过漫长而困难的 SparkR 安装过程后 我遇到了启动 SparkR 的新问题 我的设置 R 3 2 0 RStudio 0 98 1103 Rtools 3 3 Spark 1 4 0 Java Version 8 SparkR 1 4
  • 基于 Python 中另外两个数组的值创建数组的子集

    我正在使用Python 如何根据其他两个具有相同长度的向量的值对向量进行子选择 例如这三个向量 c1 np array 1 9 3 5 c2 np array 2 2 3 2 c3 np array 2 3 2 3 c2 2 array T
  • 如何在 Xamarin.Forms 运行时动态添加输入字段

    我正在使用 Xamarin Forms 开发一个项目 我需要在运行时动态创建输入字段 例如 系统会询问用户在一支球队中比赛的球员人数 并根据我需要创建的用户提供的数据Entry每个玩家的姓名 年龄 联系方式等字段 但这如何帮助我动态添加输入
  • Oracle 自连接多个可能的列匹配 - CONNECT BY?

    我有一个来自 的查询需求 尝试解决它CONNECT BY 但似乎无法得到我需要的结果 表 简化 create table CSS USER DESC USER ID VARCHAR2 30 not null NEW USER ID VARC