用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
字段,我只是为了使更多的可读性)
这个查询的答案应该是这样的:
我希望它可以帮助别人!
现在,我想知道如何在MySQL上做这个… ^^
我之前没有使用过连接,但是快速search显示它用于树状结构。 在SQL Server中,您使用公用表expression式来获得类似的function。