我想检索一个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)
它只给我一排.我还想将这些记录插入临时表变量中.我怎样才能做到这一点.提前致谢.很抱歉问这个简单的问题(虽然不是我)
我昨天回答了一个递归的CTE,它揭示了这些在SQL Server中实现的方式的问题(也可能在其他RDBMS中?).基本上,当我尝试使用ROW_NUMBER
当前的递归级别时,它会针对当前递归级别的每个行子集运行.我希望这可以在真正的SET逻辑中工作,并针对整个当前的递归级别运行.
看来,从这篇MSDN文章中,我发现的问题是预期的功能:
CTE的递归部分中的分析和聚合函数应用于当前递归级别的集合,而不应用于CTE的集合.像ROW_NUMBER这样的函数只对当前递归级别传递给它们的数据子集起作用,而不是对整个CTE递归部分的数据集合起作用.有关更多信息,请参阅J.在递归CTE中使用分析函数.
在我的挖掘中,我找不到解释为什么选择这样做的方式呢?这在基于集合的语言中更像是一种过程方法,因此这对我的SQL思维过程起作用,在我看来非常混乱.是否有人知道和/或可以解释为什么递归CTE以递归方式处理递归级别的分析函数?
以下是帮助可视化的代码:
请注意,RowNumber
每个代码输出中的列.
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
PostgreSQL在Oracle中是否有像"LEVEL"这样的伪列?
如果没有,那么我们如何创建一个类似于"LEVEL"的列?
oracle postgresql connect-by recursive-cte hierarchical-query
如何在我计划与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的节点.
我可以使用以下递归postgresql查询来执行此操作:
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) 我试图在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的引用.
我想编写一个查询,它将从表中构建此字符串.可能吗?
谢谢
我有这种情况:
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) 我正在尝试重复列中的第一个特定非空值,直到同一列中的下一个特定非空值.我怎么做?
数据如下所示:
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
它.我只知道那些但在这种情况下尚未使用过它们.
我正在尝试评估商店访客对 COVID-19 传播的影响。
这是一个简单的场景:
当我收集所有访问者数据以及他们在一段时间内遇到的人时,数据集如下所示:
表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专家.如果有人可以帮助我通过.
我已经递归CTE来获取如下的值.
Child1 - > Parent 1
Parent1 - > Parent 2
Parent2 - > NULL
如果数据填充出错了,那么我将有类似下面的内容,因为CTE可能会进入无限递归循环并产生最大的递归错误.由于数据量很大,我无法手动检查这些不良数据.如果有办法找到它,请告诉我.
Child1 - > Parent 1
Parent1 - > Child1
要么
Child1 - > Parent 1
Parent1 - > Parent2
Parent2 - > Child1
我为这个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) recursive-cte ×10
sql ×6
sql-server ×6
postgresql ×2
t-sql ×2
.net ×1
connect-by ×1
ecto ×1
elixir ×1
hierarchy ×1
oracle ×1
recursion ×1
row-number ×1