gpt4 book ai didi

sql-server - Oracle 'CONNECT BY PRIOR' 和 'ORDER SIBLINGS BY' 的 SQL Server 等效项

转载 作者:行者123 更新时间:2023-12-03 22:27:29 25 4
gpt4 key购买 nike

我有这个 Oracle 代码结构,我正在尝试将其转换为 SQL Server 2008( 注意: 我使用了通用名称、包含在方括号“[]”中的列名和表名,并做了一些格式化以使代码更具可读性):

SELECT [col#1], [col#2], [col#3], ..., [col#n], [LEVEL] 
FROM (SELECT [col#1], [col#2], [col#3], ..., [col#n]
FROM [TABLE_1]
WHERE ... )
CONNECT BY PRIOR [col#1] = [col#2]
START WITH [col#2] IS NULL
ORDER SIBLINGS BY [col#3]

上述代码的 SQL Server 等效模板是什么?

具体来说,我正在努力解决 等级 , 和 '订购 sibling BY' Oracle 构造。

注:
上面的“代码”是一组 Oracle 程序的最终输出。基本上, 'WHERE' 子句是动态建立的 并根据传递的各种参数而变化。以“CONNECT BY PRIOR”开头的代码块是硬编码的。

引用:

Simulation of CONNECT BY PRIOR of ORACLE in SQL SERVER文章接近了,但它没有解释如何处理“级别”和“订单兄弟”结构。 ......我的心变得扭曲了!
SELECT name 
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid

相当于:
WITH n(empid, name) AS 
(SELECT empid, name
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT nplus1.empid, nplus1.name
FROM emp as nplus1, n
WHERE n.empid = nplus1.mgrid)
SELECT name FROM n

如果我有一个初始模板可供使用,它将大大有助于我构建 SQL Server 存储过程以构建正确的 T-SQL 语句。

援助将不胜感激。

最佳答案

模拟 LEVEL 列

通过在递归部分增加一个计数器可以很容易地模拟级别列:

WITH tree (empid, name, level) AS  (
SELECT empid, name, 1 as level
FROM emp
WHERE name = 'Joan'

UNION ALL

SELECT child.empid, child.name, parent.level + 1
FROM emp as child
JOIN tree parent on parent.empid = child.mgrid
)
SELECT name
FROM tree;

模拟 order siblings by
模拟 order siblings by有点复杂。假设我们有一列 sort_order它定义了每个父元素的顺序(不是整体排序顺序 - 因为这样 order siblings 就没有必要了)然后我们可以创建一个列,它给我们一个整体排序顺序:
WITH tree (empid, name, level, sort_path) AS  (
SELECT empid, name, 1 as level,
cast('/' + right('000000' + CONVERT(varchar, sort_order), 6) as varchar(max))
FROM emp
WHERE name = 'Joan'

UNION ALL

SELECT child.empid, child.name, parent.level + 1,
parent.sort_path + '/' + right('000000' + CONVERT(varchar, child.sort_order), 6)
FROM emp as child
JOIN tree parent on parent.empid = child.mgrid
)
SELECT *
FROM tree
order by sort_path;
sort_path 的表达式看起来很复杂,因为 SQL Server(至少是您正在使用的版本)没有简单的函数来格式化带有前导零的数字。在 Postgres 中,我将使用整数数组,以便转换为 varchar没有必要——但这在 SQL Server 中也不起作用。

关于sql-server - Oracle 'CONNECT BY PRIOR' 和 'ORDER SIBLINGS BY' 的 SQL Server 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31827817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com