SQL SERVER中ORACLE的连接仿真

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上,它也为使用此关键字提供了指导和限制,以及几个示例.

  • 我在URL http://www.ibm.com/developerworks/db2/library/techarticle/dm-0510rielau/上指出的示例确实给出了确切的查询 - 在此处复制它似乎没有意义,只需单击链接!-) (2认同)

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字段,我只是为了使其更具可读性)

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

sql返回

我希望它对某人有所帮助!

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