用SQL SERVER中的ORACLE优先模拟CONNECT

我想在SQL SERVER 2000/2005/2008中获得ORACLE的CONNECT BY PRIOR的function吗?

请帮帮我

执行recursion查询的SQL标准方法,例如IBM DB2和SQL Server ,是WITH子句。 有关将CONNECT BY转换为WITH (技术上为recursionCTE )的示例,请参阅此文章 – 该示例是针对DB2的,但我相信它也可以在SQL Server上使用。

编辑:显然,原始的querant需要一个具体的例子,这里是一个来自我已经给出的URL的IBM站点。 给定一个表格:

 CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY, name VARCHAR(10), salary DECIMAL(9, 2), mgrid INTEGER); 

其中, mgrid引用员工经理的empid ,任务是获取直接或间接向Joan报告的每个人的姓名。 在Oracle中,这是一个简单的CONNECT

 SELECT name FROM emp START WITH name = 'Joan' CONNECT BY PRIOR empid = mgrid 

在SQL Server,IBM DB2或PostgreSQL 8.4中(以及在SQL标准中,为什么值得;-),完全相同的解决scheme是recursion查询(更复杂的语法,但实际上更强大和更灵活):

 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 

Oracle的START WITH子句成为第一个嵌套的SELECT (recursion的基本情况),被recursion部分UNION编为只是另一个SELECT

当然,SQL Server特有的WITH风格也logging在MSDN上 ,它也给出了使用这个关键字的指导原则和限制,以及几个例子。

@Alex Martelli的回答非常好! 但是它只能在一个元素的时间( WHERE name = 'Joan' )如果你拿出WHERE子句,查询将一起返回所有的根行…

我改变了一些我的情况,所以它可以显示整个树的表。

表格定义:

 CREATE TABLE [dbo].[mar_categories] ( [category] int IDENTITY(1,1) NOT NULL, [name] varchar(50) NOT NULL, [level] int NOT NULL, [action] int NOT NULL, [parent] int NULL, CONSTRAINT [XPK_mar_categories] PRIMARY KEY([category]) ) 

level字面上是0级别的根级别,1级别的根级别…)

和查询:

 WITH n(category, name, level, parent, concatenador) AS ( SELECT category, name, level, parent, '('+CONVERT(VARCHAR (MAX), category)+' - '+CONVERT(VARCHAR (MAX), level)+')' as concatenador FROM mar_categories WHERE parent is null UNION ALL SELECT m.category, m.name, m.level, m.parent, n.concatenador+' * ('+CONVERT (VARCHAR (MAX), case when ISNULL(m.parent, 0) = 0 then 0 else m.category END)+' - '+CONVERT(VARCHAR (MAX), m.level)+')' as concatenador FROM mar_categories as m, n WHERE n.category = m.parent ) SELECT distinct * FROM n ORDER BY concatenador asc 

(你不需要连接level字段,我只是为了使更多的可读性)

这个查询的答案应该是这样的:

sql返回

我希望它可以帮助别人!

现在,我想知道如何在MySQL上做这个… ^^

我之前没有使用过连接,但是快速search显示它用于树状结构。 在SQL Server中,您使用公用表expression式来获得类似的function。