Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的系统连接路径_Sql_Oracle_Sql Server 2008_Recursion_Common Table Expression - Fatal编程技术网

SQL Server中的系统连接路径

SQL Server中的系统连接路径,sql,oracle,sql-server-2008,recursion,common-table-expression,Sql,Oracle,Sql Server 2008,Recursion,Common Table Expression,我正在进行一个迁移项目,需要将以下Oracle查询转换为它的SQL Server等效项 select SYS_CONNECT_BY_PATH (b.actionnr,'/') as FATHER, SYS_CONNECT_BY_PATH (b.actionnr,' | ') as REFPATH, LEVEL, (select count(p.refactionnr) from zisjob.zj_action p where p.refactionnr=b.actionnr) Chi

我正在进行一个迁移项目,需要将以下Oracle查询转换为它的SQL Server等效项

select SYS_CONNECT_BY_PATH (b.actionnr,'/') as FATHER, SYS_CONNECT_BY_PATH (b.actionnr,'     | ') as REFPATH, LEVEL, 
(select count(p.refactionnr) from zisjob.zj_action p where p.refactionnr=b.actionnr)
Childs, b.* from 
( select NVL(x.ANZFiles,0) ANZFiles, act.actionnr, act.refactionnr, act.lfno, act.jobnr,     act."TYPE", act.actiontype
from zisjob.zj_action act, zisjob.zj_actiontype t, 
( select f.lno, count(f.filenr) as ANZFiles from zisjob.zj_file f where f.lno != f.lfno     Group by f.lno )x
where act.lfno=10 and act.actiontype = t.typeid(+) and act.actionnr = x.lno(+) )
b start with b.actionnr in 
(select b.actionnr from zisjob.zj_action b where b.lfno = 10 and b.refactionnr is    null)
connect by nocycle prior b.actionnr=b.refactionnr order by 1 desc, 2 asc
我用CTEs来做这个。到目前为止,我已经得出以下结论:

with h$cte as 
(
   select
      cast (convert(varchar,b.actionnr)+'/' as varchar(max)) as FATHER,
      cast(convert(varchar,b.actionnr)+' | ' as varchar(max)) as REFPATH,
      1 as LEVEL,
      --cast (row_number() over (order by @@spid) as varchar(max)) as LEVEL,
      (select count(p.refactionnr) from zisjob.zj_action p 
       where p.refactionnr = b.actionnr) Childs, 
      b.* 
   from
     (select 
         isnull(x.ANZFiles, 0) ANZFiles, act.actionnr, act.refactionnr, act.lfno,  
         act.jobnr, act."TYPE", act.actiontype
      from zisjob.zj_action act 
      left outer join zisjob.zj_actiontype t on act.actiontype = t.typeid 
      left outer join
          (select f.lno, count(f.filenr) as ANZFiles 
           from zisjob.zj_file f
           where f.lno != f.lfno Group by f.lno ) x on act.actionnr = x.lno
      where act.lfno = 10) b
where 
   b.actionnr in
       (select b.actionnr from zisjob.zj_action b 
        where b.lfno = 10 and b.refactionnr is null)

UNION ALL

select
    CAST(FATHER + '/'+ b.ACTIONNR as varchar(max)) as FATHER,
    CAST(REFPATH + '|'+b.ACTIONNR AS VARCHAR(MAX)) as REFPATH,
    h$cte.LEVEL + 1 as LEVEL,
    (select count(p.refactionnr) from zisjob.zj_action p  
     where p.refactionnr = b.actionnr) Childs, 
    b.*
from
   (select isnull(x.ANZFiles, 0) ANZFiles, act.actionnr, act.refactionnr, 
           act.lfno, act.jobnr, act."TYPE", act.actiontype
    from zisjob.zj_action act 
    left outer join zisjob.zj_actiontype t on act.actiontype = t.typeid 
    left outer join
        (select f.lno, count(f.filenr) as ANZFiles from zisjob.zj_file f
         where f.lno != f.lfno Group by f.lno) x on act.actionnr = x.lno
    where act.lfno = 10) b, 
    h$cte
where 
    b.actionnr in
        (select b.actionnr from zisjob.zj_action b 
         where b.lfno = 10 and b.refactionnr is null)
    and h$cte.ACTIONNR = h$cte.REFACTIONNR
)
select <columns> from h$cte
翻译后的查询出现以下错误:

Msg 467,16级,状态1,第1行 递归公共表表达式“h$cte”的递归部分中不允许使用GROUP BY、HAVING或AGGRATE函数

Msg 462,16级,状态1,第1行 递归公共表表达式“h$cte”的递归部分不允许外部联接


我怎样才能解决这个问题?非常感谢任何形式的帮助。提前感谢。

我终于解决了这个问题:

WITH dummy AS(

select isnull(x.ANZFiles,0) ANZFiles, act.actionnr, act.refactionnr, act.lfno, act.jobnr, act."TYPE", act.actiontype

from zisjob.zj_action act left outer join zisjob.zj_actiontype t on act.actiontype = t.typeid left outer join 

( select f.lno, count(f.filenr) as ANZFiles from zisjob.zj_file f 

where f.lno != f.lfno Group by f.lno )x on act.actionnr = x.lno

where act.lfno=10), 

 dummy2 as(

select count(p.refactionnr) as Childs 

from zisjob.zj_action p inner join dummy b on p.refactionnr=b.actionnr

),

h$cte as(

select 

cast ('/'+convert(varchar,b.actionnr) as varchar(max)) as FATHER, 

cast(' | '+convert(varchar,b.actionnr) as varchar(max)) as REFPATH, 

1 as LEVEL,

c.Childs,

--cast (row_number() over (order by @@spid) as varchar(max)) as LEVEL, 

b.* 

from dummy b, dummy2 c

where b.actionnr in 

(select b.actionnr from zisjob.zj_action b where b.lfno = 10 and b.refactionnr is null)

UNION ALL

select

CAST(FATHER + '/'+ b.ACTIONNR as varchar(max)) as FATHER,

CAST(REFPATH + '|'+b.ACTIONNR AS VARCHAR(MAX)) as REFPATH,

h$cte.LEVEL + 1 as LEVEL,c.Childs,

b.*

from dummy b, dummy2 c, h$cte

where b.actionnr in 

(select b.actionnr from zisjob.zj_action b where b.lfno = 10 and b.refactionnr is null)

and h$cte.ACTIONNR = h$cte.REFACTIONNR

)

select * from h$cte
因为我不允许在CTE的递归成员中编写外部联接和分组,也不允许在CTE的递归成员中拥有或聚合函数,所以我将它移到了一个新的CTE下。这很有魅力


干杯

我终于解决了这个问题:

WITH dummy AS(

select isnull(x.ANZFiles,0) ANZFiles, act.actionnr, act.refactionnr, act.lfno, act.jobnr, act."TYPE", act.actiontype

from zisjob.zj_action act left outer join zisjob.zj_actiontype t on act.actiontype = t.typeid left outer join 

( select f.lno, count(f.filenr) as ANZFiles from zisjob.zj_file f 

where f.lno != f.lfno Group by f.lno )x on act.actionnr = x.lno

where act.lfno=10), 

 dummy2 as(

select count(p.refactionnr) as Childs 

from zisjob.zj_action p inner join dummy b on p.refactionnr=b.actionnr

),

h$cte as(

select 

cast ('/'+convert(varchar,b.actionnr) as varchar(max)) as FATHER, 

cast(' | '+convert(varchar,b.actionnr) as varchar(max)) as REFPATH, 

1 as LEVEL,

c.Childs,

--cast (row_number() over (order by @@spid) as varchar(max)) as LEVEL, 

b.* 

from dummy b, dummy2 c

where b.actionnr in 

(select b.actionnr from zisjob.zj_action b where b.lfno = 10 and b.refactionnr is null)

UNION ALL

select

CAST(FATHER + '/'+ b.ACTIONNR as varchar(max)) as FATHER,

CAST(REFPATH + '|'+b.ACTIONNR AS VARCHAR(MAX)) as REFPATH,

h$cte.LEVEL + 1 as LEVEL,c.Childs,

b.*

from dummy b, dummy2 c, h$cte

where b.actionnr in 

(select b.actionnr from zisjob.zj_action b where b.lfno = 10 and b.refactionnr is null)

and h$cte.ACTIONNR = h$cte.REFACTIONNR

)

select * from h$cte
因为我不允许在CTE的递归成员中编写外部联接和分组,也不允许在CTE的递归成员中拥有或聚合函数,所以我将它移到了一个新的CTE下。这很有魅力

干杯

我通过创建一个数据库函数解决了这个问题

创建一个类似于ufn_GetParentPath的函数,使用它而不是SYS_CONNECT_BY_PATH传递ID作为参数

CREATE FUNCTION [dbo].[ufn_GetParentPath] ( @pCurrentNodeID    INT )
RETURNS VARCHAR(1000)
AS
BEGIN

DECLARE @vCurrentNodeName     VARCHAR(50)
DECLARE @vParentID            INT

IF @pCurrentNodeID IS NULL OR @pCurrentNodeID = 0
    RETURN NULL

SELECT @vCurrentNodeName = [Name], @vParentID = [ParentID]
FROM [dbo].[Hierarchy]
WHERE [ID] = @pCurrentNodeID

RETURN ISNULL([dbo].[ufn_GetParentPath] ( @vParentID ) + '/', '') + @vCurrentNodeName

END
GO
我通过创建一个数据库函数解决了这个问题

创建一个类似于ufn_GetParentPath的函数,使用它而不是SYS_CONNECT_BY_PATH传递ID作为参数

CREATE FUNCTION [dbo].[ufn_GetParentPath] ( @pCurrentNodeID    INT )
RETURNS VARCHAR(1000)
AS
BEGIN

DECLARE @vCurrentNodeName     VARCHAR(50)
DECLARE @vParentID            INT

IF @pCurrentNodeID IS NULL OR @pCurrentNodeID = 0
    RETURN NULL

SELECT @vCurrentNodeName = [Name], @vParentID = [ParentID]
FROM [dbo].[Hierarchy]
WHERE [ID] = @pCurrentNodeID

RETURN ISNULL([dbo].[ufn_GetParentPath] ( @vParentID ) + '/', '') + @vCurrentNodeName

END
GO