2013-04-24 63 views
0

对不起我的问题标题,我找不到更好的名称。根据select语句在数据库中获取值

这是我的表:

Project_ID ParentProject Projecttype 
---------------------------------------- 
20.003  20.001   P 
20.001  20    P 
20   NULL   V 
21.001  21    P 
21   NULL   V 

我要做出选择我所有的项目与它的“upperparentproject”。我想用Projecttype = 'P' a ParentProjectProjecttype = 'V'搜索所有项目。所以这是我的结果:

Project_ID ParentProject 
-------------------------- 
20.003  20   
20.001  20     
21.001  21   

这是可能的SELECT陈述或有执行这个法子?

+0

可以使用递归CTE来实现这一目标。但是如果你的表有点大,递归CTE将表现得最差。 – Maximus 2013-04-24 08:59:37

+0

这确实是一个很大的表(11000行),你能给我一个使用我的示例表递归CTE的例子吗? – Jovano 2013-04-24 09:02:52

+0

请参阅此链接递归CTE http://blog.sqlauthority.com/2008/07/28/sql-server-simple-example-of-recursive-cte/ - 我会在我得到时间后发布答案。我现在有点忙:( – Maximus 2013-04-24 09:32:08

回答

0

试试这个:

select *,row_number() over (order by (select 0)) as rn  into tbl1 from table1 

Declare @mn int,@mx int 
Declare @mn1 int,@mx1 int 
Declare @prjid float,@prntid varchar(10) 
DECLARE @result TABLE(prjID float,prentID varchar(10)) 

select @mn=MIN(rn),@mx=MAX(rn) from tbl1 

WHILE(@mn<[email protected]) 
BEGIN 
select @prjid=Project_id,@prntid=ParentProject from tbl1 where [email protected] and ProjectType='P' 
select @mn1=MIN(rn),@mx1=MAX(rn) from tbl1 

WHILE(@mn1<[email protected]) 
BEGIN 
select @prntid=CASE WHEN ParentProject IS NOT NULL then ParentProject else @prntid end from tbl1 where [email protected] and rn = @mn1 
SET @[email protected]+1 
END 

INSERT INTO @result 
values(@prjid,@prntid) 

SET @[email protected]+1 
END 
select distinct * from @result 
+0

对不起,这个愚蠢的问题,但我从来没有工作与over/into:什么是你的代码的第一林'table1'defen?当我尝试查询在我自己的数据库中,这就是我卡住的地方 – Jovano 2013-04-24 10:29:01

+0

嘿,我只是将你的主表复制到另一个带有序列号的表tbl1中ROW_NUMBER()用于生成序列号,如标识列 – AnandPhadke 2013-04-24 11:17:34

+0

在这里,将table1替换为实际的表 – AnandPhadke 2013-04-24 11:17:57

相关问题