当前位置: 首页 > 面试题库 >

我想在SQL中使用递归返回新列吗?

汪凌
2023-03-14
问题内容

我有下表所示的表

| Employee ID | Manager ID |
|:-----------:|:----------:|
| E068        | E067       |
| E071        | E067       |
| E229        | E069       |
| E248        | E144       |
| E226        | E223       |
| E236        | E241       |
| E066        | E001       |
| E067        | E001       |
| E144        | E001       |
| E223        | E001       |
| E001        | Null       |
| E241        | Null       |

我们有包含“领导者ID”的表

| Leader ID |
|-----------|
| E001      |
| E241      |

问题陈述:

此问题是通过使用Employee及其Manager数据来确定Manager的负责人。

关于:我们有一个员工ID和他们的经理ID。请注意,经理ID来自员工ID。由于每位经理都有一个高于其级别的经理。

首先,我们将在Manager ID列中获取所有UNIQUE ID。然后,对于Manager ID列中的每个ID,我们将查找其各自的Manager
ID(Manager),然后将创建一个新列名称 Leader ,其中将包含Manager的所有层次结构。

要求的输出:

| Employee ID | Manager ID  | Leader ID |
|-------------|-------------|-----------|
| E068        | E067        | E001      |
| E071        | E067        | E001      |
| E229        | E069        | E001      |
| E248        | E144        | E001      |
| E226        | E223        | E001      |
| E236        | E241        | E241      |
| E066        | E001        | E001      |
| E067        | E001        | E001      |
| E144        | E001        | E001      |
| E223        | E001        | E001      |

雇员ID列包含UNIQUE ID,而经理ID列包含DUPLICATES ID。


问题答案:

这是WITH RECURSIVE的典型示例

使用RECURSIVE,WITH查询可以引用其自身的输出。

试试这个:

with recursive subordinates as
  (select 
      employeid, 
      e.managerid, 
      e.managerid as leader 
   from employes e 
   where e.managerid in(select * from leaders) -- non recursive term
   union 
   select 
      e.employeid, 
      e.managerid, 
      a.managerid as leader 
    from employes e 
          join subordinates a on a.employeid = e.managerid -- recursive term
) select * from subordinates

如文档中所述:

一个 WITH RECURSCIVE 总是由组成

  1. 非递归项
  2. UNIONUNION ALL
  3. 一个递归术语, 唯一可以引用查询输出的* 术语 *

当先前的迭代没有输出时,终止将终止。



 类似资料:
  • 我正在创建一个递归导航迷宫的程序。代码: 然而,每当我到达死胡同时,它都不会回溯。当我调试时,它表明当程序从递归或“回溯”返回时,我的起始值专注于停留在我的死胡同空间。 例如: 9是我的出发点。2是我的退出。4是我的道路。1 表示墙壁。当我到达一个死胡同时(在本例中为第 7 行,第 2 列)。我的立场是等于整个程序其余部分的死胡同空间。这是为什么呢?

  • 我不得不使用全局变量found来指示在哪里找到了一个和。返回语句始终未定义。 此外,如果在下面的if语句中使用return语句,代码将无法正常工作。 这不是问题的最佳解决方案,但这是我得到的工作版本。 返回语句之间的****,删除时代码工作,否则我要么得到false或未定义。我不明白这部分!为什么删除返回就能解决问题,我认为每个递归调用都必须用返回语句进行。 问题可能是由于多次呼叫造成的吗?我是不

  • 问题内容: def foo(a): a.append(1) if len(a) > 10: print a return a else: foo(a) 为什么此递归函数返回None(请参见下面的脚本)?我不太明白我在做什么错。 问题答案: 您不会在该子句中返回任何内容:

  • 问题内容: 我想从已更新的行中获取列的OLD值-无需使用触发器(也无需使用存储过程,也无需使用任何其他额外的非-SQL / -query实体)。 我有这样的查询: 如果我可以在子查询的末尾做这件事,那真是太了不起了(并解决了我的其他问题/问题)。但这是行不通的:不能将其与GROUP BY(这对于计算计数是必需的)结合使用。然后,我可以采用那些的值,并先执行查询以获取(即将被)以前的processi

  • 我试图在Java中创建一个方法,它打印fib序列,直到传递给该方法的数字。我的问题是,我需要使用int返回类型来返回序列,而我不能使用递归。

  • 我试图递归返回单链表的子列表。 例:列表=3- sub(list,1,2)应返回4- 参数1-开始索引 参数2-子列表的长度 我有点麻烦,因为我的代码只返回子列表的最后一个元素,而不是整个子列表。