SQL - 每个级别都有记录的递归树层次结构

2024-05-25

尝试使用 SAS(据我所知,不支持WITH RECURSIVE)在 SQL 中创建经典的层次结构树。

这是现有表中的简化数据结构:

|USER_ID|SUPERVISOR_ID|

因此,要构建层次结构,您只需递归连接 x 次即可获取您要查找的数据,其中SUPERVISOR_ID = USER_ID。在我公司,是16级。

当尝试让每个用户终止分支时会出现此问题。例如,假设级别 1 的用户 A 下有级别 2 的用户 B、C、D 和 E。因此,使用递归 LEFT JOIN,您将得到:

| -- Level 1 -- | -- Level 2 -- |
     User A          User B
     User A          User C
     User A          User D
     User A          User E

问题是,用户 A 没有自己的终止分支。需要的最终结果是:

| -- Level 1 -- | -- Level 2 -- |
     User A           NULL         
     User A          User B
     User A          User C
     User A          User D
     User A          User E

我的第一个想法是我可以通过在每个级别创建一个临时表然后对结果一起执行 UNION ALL 来解决这个问题,但是考虑到大小(16 个级别),这似乎效率非常低,我希望我在这里遗漏了一些东西是一个更清洁的解决方案。


我不太确定我理解这个问题,但如果您试图生成每个主管下的所有员工的完整列表,那么这是一种方法,假设每个员工都有一个唯一的 ID,该 ID 可以出现在用户或主管列:

data employees;
input SUPERVISOR_ID USER_ID;
cards;
1 2
1 3
1 4
2 5
2 6
2 7
7 8
;
run;

proc sql;
  create view distinct_employees as 
  select distinct SUPERVISOR_ID as USER_ID from employees
  union
  select distinct USER_ID from employees;
quit;

data hierarchy;
  if 0 then set employees;
  set distinct_employees;
  if _n_ = 1 then do;
    declare hash h(dataset:'employees');
    rc = h.definekey('USER_ID');
    rc = h.definedata('SUPERVISOR_ID');
    rc = h.definedone();
  end;
  T_USER_ID = USER_ID;
  do while(h.find() = 0);
    USER_ID = T_USER_ID;
    output;
    USER_ID = SUPERVISOR_ID;
  end;
  drop rc T_USER_ID;
run;

proc sort data = hierarchy;
  by SUPERVISOR_ID USER_ID;
run;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL - 每个级别都有记录的递归树层次结构 的相关文章

随机推荐

  • 根据同一 select 语句中先前计算的行(或列)计算新行(或列)

    我正在尝试根据年度销售增长预期来计算年度预期销售量 在一张表中 我有实际销量 create table Sales ProductId int Year int GrowthRate float insert into Sales valu
  • IOS - 委托与通知

    想听听您对以下架构的看法 在我的应用程序中 我有一个处理异步登录的静态类 LoginManager 登录阶段完成后 应用程序应该做出响应并转换到另一个状态 我有2条实施建议 使用委托 import Foundation protocol L
  • 泛化 R %in% 运算符以匹配元组

    前几天我花了一段时间寻找一种方法来检查行向量是否包含在 R 中的某些行向量集中 基本上 我想概括 in 运算符来匹配元组而不是向量中的每个条目 例如 我想要 row vec c A 3 row vec 1 A 3 data set rbin
  • UIAlertController 的弹出框变形

    我使用 UIToolbar 中的 UIAlertController 和首选操作表样式向用户呈现选项列表 呈现时 弹出框的箭头被切断 其角以两种不同的半径圆化 据我所知 我用来展示它的代码直接来自文档 UIAlertController a
  • Paypal Rest API - 来自批准 URL 的令牌生命周期

    我使用 Paypal Rest API 我的问题是 有多长token来自批准 URL 有效吗 我想将此令牌 也包含我的令牌 存储到数据库并生成带有我的令牌的链接 稍后 如果我单击此链接 将我的令牌替换为 paypal 令牌 我想重定向到 p
  • 如何获取元素相对于当前屏幕位置的偏移量?

    我正在尝试用纯 Javascript 重构所有 jQuery 除了非常具体的值之外 一切都正常工作 根据此代码的浏览器供应商 我得到了不同的值 对于 jQuery 我会使用 var topSelected figure offset top
  • 2 同一个表的同一列上的 PostgreSQL 索引 - 冗余吗?

    我有一个带有 2 个索引的 PostgreSQL 表 其中一项指数涵盖website id and tweet idcolumns 是唯一的 B 树索引 第二个索引仅涵盖website id列 并且是非唯一索引 如果第一个索引存在 第二个索
  • 如何指定 clang-format 的子选项?

    在 clang format 文件中我可以说 BasedOnStyle LLVM BreakBeforeBraces Custom BraceWrapping AfterClass false AfterFunction true 如何在命
  • 将 Azure AD 集成到 Java Web 应用程序中

    我是 Azure 和 OpenIDConnect 的新手 首先 我克隆了示例 git 应用程序并尝试测试它 它给了我以下错误 War 有 oauth2 jar 我可以看到那里存在的类文件 git 网址 https github com Az
  • Lambda 按值捕获和“mutable”关键字

    关键词的必要性mutable在 lambda 中 是造成极大混乱的根源 考虑代码 int x 10 function
  • 迭代 NSDictionary 时保持顺序

    我有一个 NSDictionary 它正在迭代并将数据保存到核心数据 如下所示 NSDictionary details valueDict objectForKey shipment master for NSDictionary res
  • 有关 HTML 和 PHP 开发工具的帮助

    我是网络开发新手 我有使用原始 HTML 的经验 使用记事本 但我计划为我的最后一年项目制作一个网站 我之前曾就其想法提出过问题 现在我需要一些开发部分的帮助 我可以使用哪种工具来设计网站 请建议一些易于使用且功能强大的工具 利用这些工具我
  • 从路径中删除不必要的斜杠

    path home to my site 我正在尝试删除不必要的正斜杠 从上面的路径 我正在努力得到这个结果 home to my site 我失败了str replace 因为我不知道斜线的数量 优雅的解决方案 With preg rep
  • 我可以将 SQL Server 安装在 USB 驱动器上吗?

    我是一名开发人员 如果可以的话 我经常远程工作 而不是通勤上班 我希望能够随身携带开发数据库环境 我知道我可以远程访问数据库 但速度很慢 我有时在没有无线连接的地方工作 有任何想法吗 是的 这是可能的 看this http social m
  • 用左div填充剩余空间

    谁能告诉我如何让左侧 div 填充剩余空间 而不固定右侧 div 大小 我想要与以下示例完全相反的内容 left float left border 1px solid blue right overflow hidden border 1
  • 在 Angular2 (TS) 中导入模块的选项

    我知道有一些进展或至少有计划 5093 https github com Microsoft TypeScript issues 5039 5728 https github com Microsoft TypeScript pull 57
  • 无法验证 serde:org.openx.data.jsonserde.jsonserde

    我编写了这个查询来在配置单元上创建一个表 我的数据最初是 json 格式 所以我已经下载并构建了 serde 并添加了它运行所需的所有 jar 但我收到以下错误 FAILED Execution Error return code 1 fr
  • 包括来自raw.github.com的js

    我有一个 github com 演示页面 链接到https raw github com master file js https raw github com master file js这样我就不需要总是复制 js文件转移到gh pag
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • SQL - 每个级别都有记录的递归树层次结构

    尝试使用 SAS 据我所知 不支持WITH RECURSIVE 在 SQL 中创建经典的层次结构树 这是现有表中的简化数据结构 USER ID SUPERVISOR ID 因此 要构建层次结构 您只需递归连接 x 次即可获取您要查找的数据