SQL迭代语法错误



任何人都可以帮助我下面的sql,给定一个表parent_child_grouping其中包含两列parent_name和child_name,其中一个孩子可以是其他孩子的父母。

我试图写一个sql (sybase兼容sql-它最终会进入一个存储过程),给定一个父母列表,它会迭代并返回输入的所有子和子。

我写了如下:

    DECLARE @parents varchar(500)
    set @parents = "'parent1', 'parent2'"
 if  exists (select 1 from sysobjects where type='U' and name='pg_result')
     drop table pg_result
if  exists (select 1 from sysobjects where type='U' and name='temp_intermediat_res')
     drop table temp_intermediat_res

    DECLARE @sql varchar(500)
    SET @sql = 'SELECT 
                    pg.parent_name, 
                    pg.child_name 
                into pg_result
                FROM 
                    mydb..parent_child_grouping pg
                WHERE 
                    pg.parent_name IN (' +@parents+')'
execute( @sql)
go
select r.parent_name,r.child_name into temp_intermediat_res from pg_result r 
go
DECLARE @foundchildren integer
set @foundchildren = 1
while(@foundchildren > 0)
begin
        insert pg_result select pg.parent_name,pg.child_name from mydb..parent_child_grouping pg,temp_intermediat_res i
             where i.child_name=pg.parent_name
        set @foundchildren = @@rowcount
        select i.parent_name into parents_list from temp_intermediat_res i
        drop table temp_intermediat_res
        select pg.parent_name, pg.child_name into temp_intermediat_res 
            from 
                 mydb..parent_child_grouping pg,
                 parents_list p 
            where p.parent_name=pg.parent_name
        drop table parents_list

end --while
go
select pg.parent_name, pg.child_name from pg_result pg
go

这给了我下面的语法错误:

 >[Error] Script lines: 170-196 ----------------------
 There is already an object named 'temp_intermediat_res' in the database.
 Msg: 2714, Level: 16, State: 1
 Server: SYBDEV, Line: 16 

有点奇怪,因为我刚刚在前一行中删除了表

第16行及其周围如下(在上面的sql中):

 drop table temp_intermediat_res
         select pg.* into temp_intermediat_res 
             from 

如果drop表由于某种原因没有生效。

我真的不需要temp_intermediat_res和pg_result是永久表,并且在它们的名字前面加上#(使它们成为临时表)也会导致问题。

有什么想法吗?

我正在使用sybase(选择@@版本给出:Adaptive Server Enterprise/12.5.4/EBF 16785 ESD#10/p/Sun_svr4/OS 5.8/ase1254/2159/64位/FBO/Mon Nov 2 13:08:08 2009)

谢谢

使用下面的代码,您可以随心所欲地深入。变量@numberOfIterations定义了您想要看到的子节点的数量。

DECLARE @numberOfIterations int
DECLARE @parents varchar(500)
set @parents = "'parent1', 'parent2'"
set @numberOfIterations = 3
DECLARE @sql varchar(500)
create table #pcg_result ( parent_name varchar, child_name varchar )
create table #pcg1_result ( parent_name varchar, child_name varchar )
create table #pcg2_result ( parent_name varchar, child_name varchar )
SET @sql = 'insert into #pcg_result
            SELECT 
                    pcg.parent_name, 
                    pcg.child_name 
                FROM 
                    mydb..parent_child_grouping pcg
                WHERE 
                    pcg.parent_name IN (' +@parents+')' execute( @sql)
insert into #pcg1_result select parent_name, child_name from
#pcg_result
while(@numberOfIterations <> 0) begin
    truncate table #pcg2_result
    insert into #pcg2_result
    select pcg.parent_name, pcg.child_name
    from mydb..parent_child_grouping pcg where parent_name in (select child_name from #pcg1_result)
    insert into #pcg_result
    select parent_name, child_name
    from #pcg2_result
    truncate table #pcg1_result
    insert into #pcg1_result
    select parent_name, child_name
    from #pcg2_result
    set @numberOfIterations = @numberOfIterations - 1 end
select distinct parent_name, child_name from #pcg_result

drop table #pcg_result
drop table #pcg1_result
drop table #pcg2_result
go

最新更新