任何人都可以帮我解决下面的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
好像丢弃表由于某种原因没有生效。
我真的不需要将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-bit / FBO / Mon Nov 2 13 :08:08 2009)
由于
答案 0 :(得分:1)
使用以下代码,您可以尽可能深入。
变量@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