标签: recursive-cte

让所有父母为孩子

我想检索一个id的parentid,如果那个parentid有一个父母再次检索它,依此类推.一种层次表.

id----parentid
1-----1
5-----1
47894--5
47897--47894
Run Code Online (Sandbox Code Playgroud)

我是sql server的新手并试过,有些查询如下:

with name_tree as 
(
   select id, parentid
   from Users
   where id = 47897 -- this is the starting point you want in your recursion
   union all
   select c.id, c.parentid
   from users c
   join name_tree p on p.id = c.parentid  -- this is the recursion
) 
select *
from name_tree;
Run Code Online (Sandbox Code Playgroud)

它只给我一排.我还想将这些记录插入临时表变量中.我怎样才能做到这一点.提前致谢.很抱歉问这个简单的问题(虽然不是我)

t-sql sql-server recursion hierarchy recursive-cte

21
推荐指数
1
解决办法
2万
查看次数

为什么递归CTE在程序上运行分析函数(ROW_NUMBER)?

我昨天回答了一个递归的CTE,它揭示了这些在SQL Server中实现的方式的问题(也可能在其他RDBMS中?).基本上,当我尝试使用ROW_NUMBER当前的递归级别时,它会针对当前递归级别的每个行子集运行.我希望这可以在真正的SET逻​​辑中工作,并针对整个当前的递归级别运行.

看来,从这篇MSDN文章中,我发现的问题是预期的功能:

CTE的递归部分中的分析和聚合函数应用于当前递归级别的集合,而不应用于CTE的集合.像ROW_NUMBER这样的函数只对当前递归级别传递给它们的数据子集起作用,而不是对整个CTE递归部分的数据集合起作用.有关更多信息,请参阅J.在递归CTE中使用分析函数.

在我的挖掘中,我找不到解释为什么选择这样做的方式呢?这在基于集合的语言中更像是一种过程方法,因此这对我的SQL思维过程起作用,在我看来非常混乱.是否有人知道和/或可以解释为什么递归CTE以递归方式处理递归级别的分析函数?


以下是帮助可视化的代码:

请注意,RowNumber每个代码输出中的列.

这是CTE的SQLFiddle(仅显示递归的第二级)

WITH myCTE
AS
(
  SELECT *, ROW_NUMBER() OVER (ORDER BY Score desc) AS RowNumber, 1 AS RecurseLevel
  FROM tblGroups
  WHERE ParentId IS NULL

  UNION ALL

  SELECT tblGroups.*, 
      ROW_NUMBER() OVER (ORDER BY myCTE.RowNumber , tblGroups.Score desc) AS RowNumber, 
      RecurseLevel + 1 AS RecurseLevel
  FROM tblGroups
      JOIN myCTE
          ON myCTE.GroupID = tblGroups.ParentID
 )
SELECT *
FROM myCTE
WHERE RecurseLevel = 2; …
Run Code Online (Sandbox Code Playgroud)

sql sql-server row-number common-table-expression recursive-cte

12
推荐指数
1
解决办法
1797
查看次数

PostgreSQL在Oracle中是否有像"LEVEL"这样的伪列?

PostgreSQL在Oracle中是否有像"LEVEL"这样的伪列?
如果没有,那么我们如何创建一个类似于"LEVEL"的列?

oracle postgresql connect-by recursive-cte hierarchical-query

10
推荐指数
2
解决办法
7992
查看次数

使用Ecto的递归CTE

如何在我计划与Ecto一起运行的查询中使用递归CTE的结果?例如,假设我有一个表,节点,结构如下:

-- nodes table example --

id  parent_id
1   NULL
2   1
3   1
4   1
5   2
6   2
7   3
8   5
Run Code Online (Sandbox Code Playgroud)

我还有另一个表nodes_users结构如下:

-- nodes_users table example --

node_id   user_id
1         1
2         2
3         3
5         4
Run Code Online (Sandbox Code Playgroud)

现在,我想抓住具有特定节点或其上方节点的所有用户,为了示例,我们选择具有id 8的节点.

我可以使用以下递归查询来执行此操作:

WITH RECURSIVE nodes_tree AS (
    SELECT *
    FROM nodes
    WHERE nodes.id = 8
UNION ALL
    SELECT n.*
    FROM nodes n
    INNER JOIN nodes_tree nt ON nt.parent_id = n.id
)
SELECT u.* FROM users u
INNER …
Run Code Online (Sandbox Code Playgroud)

postgresql elixir recursive-cte ecto phoenix-framework

9
推荐指数
1
解决办法
1492
查看次数

递归CTE问题

我试图在SQL Server中使用递归CTE从包含底层树结构的表中构建谓词公式.例如,我的表看起来像:

Id  |  Operator/Val |  ParentId
--------------------------
1   | 'OR'          |  NULL 
2   | 'AND'         |  1
3   | 'AND'         |  1
4   | '>'           |  2
5   | 'a'           |  4
6   | 'alpha'       |  4
...
Run Code Online (Sandbox Code Playgroud)

...表示((a>α)AND(b>β))OR((c>γ)AND(a <delta)).

ParentId是对父节点的同一表中的Id的引用.

我想编写一个查询,它将从表中构建此字符串.可能吗?

谢谢

sql-server recursive-cte

6
推荐指数
2
解决办法
1692
查看次数

SQL Server CTE循环; 将所有记录一起插入

我有这种情况:

drop table #t1;
drop table #t2

select * 
into #t1
from
    (select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va4'c1,'vb4'c2,'vc4'c3) t

select *
into #t2
from #t1
where 0 = 1

;with tmp1 as
(
    select 
        t1.*,
        ROW_NUMBER() …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server common-table-expression recursive-cte

6
推荐指数
1
解决办法
215
查看次数

在列中的两个值之间重复值

我正在尝试重复列中的第一个特定非空值,直到同一列中的下一个特定非空值.我怎么做?

数据如下所示:

ID | Msg  
---+-----
 1 |     
 2 |  
 3 |  
 4 |  
 5 | Beg  
 6 | End  
 7 |  
 8 | Beg  
 9 |  
10 |   
11 |  
12 | End
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

ID | Msg  
---+-----
 1 |     
 2 |  
 3 |  
 4 |  
 5 | Beg  
 6 | End  
 7 |  
 8 | Beg    
 9 | Beg   
10 | Beg    
11 | Beg  
12 | End
Run Code Online (Sandbox Code Playgroud)

我调查了一下LAG(),LEAD()但我一直在想,我必须使用CURSOR它.我只知道那些但在这种情况下尚未使用过它们.

sql sql-server recursive-cte sql-server-2014

6
推荐指数
1
解决办法
98
查看次数

生成分层数据的复杂递归 SQL

我正在尝试评估商店访客对 COVID-19 传播的影响。

这是一个简单的场景:

  1. 访客 A 走进商店,遇到了员工 1 @ Time = 0。
  2. 然后,访问者 A 在时间 = 1 时遇到了员工 2。
  3. 访客 B 走进商店并遇到 Employee1 @ Time = 1。
  4. VisitorB 然后遇到 Employee3 @ Time = 2。
  5. 访客A离开商店。

当我收集所有访问者数据以及他们在一段时间内遇到的人时,数据集如下所示:

visitorByEmployee

| VisitorID | EmployeeID | Contact           |
+-----------+------------+-------------------+
| 100       |   X123     | 3/11/2020 1:00    |
| 100       |   X124     | 3/11/2020 1:10    |
| 101       |   X123     | 3/12/2020 1:11    |
| 101       |   X125     | 3/11/2020 1:20    |
| …
Run Code Online (Sandbox Code Playgroud)

sql common-table-expression recursive-cte sql-server-2016

6
推荐指数
1
解决办法
96
查看次数

在CTE中找到无限递归循环

我不是SQL专家.如果有人可以帮助我通过.

我已经递归CTE来获取如下的值.

Child1 - > Parent 1

Parent1 - > Parent 2

Parent2 - > NULL

如果数据填充出错了,那么我将有类似下面的内容,因为CTE可能会进入无限递归循环并产生最大的递归错误.由于数据量很大,我无法手动检查这些不良数据.如果有办法找到它,请告诉我.

Child1 - > Parent 1

Parent1 - > Child1

要么

Child1 - > Parent 1

Parent1 - > Parent2

Parent2 - > Child1

sql recursive-cte

4
推荐指数
4
解决办法
9328
查看次数

递归CTE - 查找经理以下的所有员工

我为这个SQLFIDDLE创建了一个示例小提琴

CREATE TABLE [dbo].[Users](
    [userId] [int] ,
    [userName] [varchar](50) ,
    [managerId] [int] ,
   )

INSERT INTO dbo.Users
    ([userId], [userName], [managerId])
VALUES
(1,'Darry',NULL),
(2,'Cono',1),
(3,'Abros',2),
(4,'Natesh',1),
(5,'Ani',3),
(6,'Raju',5),
(7,'Pinky',5),
(8,'Miya',4)
Run Code Online (Sandbox Code Playgroud)

我的要求就是在特定经理下方显示所有员工层级

这是我试过的

WITH UserCTE AS (
  SELECT userId, userName, managerId, 0 AS EmpLevel
  FROM Users where managerId IS NULL

  UNION ALL

  SELECT usr.userId, usr.userName, usr.managerId, mgr.[EmpLevel]+1
  FROM Users AS usr
    INNER JOIN UserCTE AS mgr
      ON usr.managerId = mgr.userId where usr.managerId IS NOT NULL
)
SELECT * 
  FROM UserCTE …
Run Code Online (Sandbox Code Playgroud)

.net sql sql-server recursive-cte

3
推荐指数
1
解决办法
8442
查看次数