pri*_*kar 42 sql-server sql-server-2005
我想在SQL SERVER 2000/2005/2008中获得ORACLE的CONNECT BY PRIOR的功能吗?
请帮我
Ale*_*lli 67
实现递归查询的SQL标准方法(例如由IBM DB2和SQL Server实现)是该WITH子句.有关将a 转换为(技术上是递归CTE)的一个示例,请参阅本文 - 该示例适用于DB2,但我相信它也适用于SQL Server.CONNECT BYWITH
编辑:显然原始的querant需要一个特定的例子,这里是我已经给出了我的URL的IBM站点.给出一张表:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
Run Code Online (Sandbox Code Playgroud)
这里mgrid引用一个员工的经理empid,任务,得到大家谁直接或间接地对报告的名称Joan.在Oracle中,这很简单CONNECT:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
Run Code Online (Sandbox Code Playgroud)
在SQL Server,IBM DB2或PostgreSQL 8.4(以及SQL标准中,对于那些值得的东西;-),完全等效的解决方案是递归查询(更复杂的语法,但实际上,更强大的功能和灵活性):
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
Run Code Online (Sandbox Code Playgroud)
Oracle的START WITH子句成为第一个嵌套的SELECT,递归的基本情况,UNION用递归部分编辑,这是另一个SELECT.
SQL Server的特定风格WITH当然记录在MSDN上,它也为使用此关键字提供了指导和限制,以及几个示例.
vin*_*a87 11
@Alex Martelli的答案很棒!但它只适用于time(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])
)
Run Code Online (Sandbox Code Playgroud)
(level字面意思是类别0的级别:root,1:root之后的第一级,......)
和查询:
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
Run Code Online (Sandbox Code Playgroud)
(你不需要连接level字段,我只是为了使其更具可读性)
这个查询的答案应该是这样的:

我希望它对某人有所帮助!
现在,我想知道如何在MySQL上做这个... ^^
| 归档时间: |
|
| 查看次数: |
93074 次 |
| 最近记录: |