2011-06-27 99 views
1

我有一个样本输入表作为ROW_NUMBER模拟在SQL Server 2000

Declare @input TABLE(Name VARCHAR(8)) 
INSERT INTO @input(Name) values('Aryan') 
INSERT INTO @input(Name) values('Aryan') 
INSERT INTO @input(Name) values('Joseph') 
INSERT INTO @input(Name) values('Vicky') 
INSERT INTO @input(Name) values('Jaesmin') 
INSERT INTO @input(Name) values('Aryan') 
INSERT INTO @input(Name) values('Jaesmin') 
INSERT INTO @input(Name) values('Vicky') 
INSERT INTO @input(Name) values('Padukon') 
INSERT INTO @input(Name) values('Aryan') 
INSERT INTO @input(Name) values('Jaesmin') 
INSERT INTO @input(Name) values('Vick') 
INSERT INTO @input(Name) values('Padukon') 
INSERT INTO @input(Name) values('Joseph') 
INSERT INTO @input(Name) values('Marya') 
INSERT INTO @input(Name) values('Vicky') 

另外我有一个符合表作为下

declare @t table(n int) 
insert into @t select 1 union all select 2 union all 
select 3 union all select 4 union all select 5 union all 
select 6 union all select 7 union all select 8 union all 
select 9 union all select 10 union all select 11 union all 
select 12 union all select 13 union all select 14 union all 
select 15 union all select 16 union all select 17 union all 
select 18 union all select 19 union all select 20 

在SQL Server 2005中,如果我做的

Select rn, name from (
    select ROW_NUMBER()over (order by Name) as rn , * from @input) x 
    where rn % 2 <> 0 

我得到的输出为

rn name 
1 Aryan 
3 Aryan 
5 Jaesmin 
7 Jaesmin 
9 Joseph 
11 Padukon 
13 Vick 
15 Vicky 

Bu我只限于Sql server 2000.我怎样才能得到相同的输出?

我试图与

SELECT name, (SELECT COUNT(*) FROM @input AS i2 WHERE i2.Name <= i1.Name) As rn 
FROM @input AS i1 

但输出是错误的

name rn 
Aryan 4 
Aryan 4 
Joseph 9 
Vicky 16 
Jaesmin 7 
Aryan 4 
Jaesmin 7 
Vicky 16 
Padukon 12 
Aryan 4 
Jaesmin 7 
Vick 13 
Padukon 12 
Joseph 9 
Marya 10 
Vicky 16 
+0

@marc_s:作为写@Maximilian Mayerl - 它是更多钞票)。 – TcKs

+0

理货桌有什么意义? – gbn

+0

根据@Maximilians的回答,您需要向'@ Input'添加一列或将数据插入到另一个临时表/表变量中,因为SQL Server无法订购例如名字='Aryan'的四行 –

回答

2

使用以下查询:

SELECT t1.name, t.n 
FROM 
(
    SELECT a.name, a.c, (SELECT COUNT(*) FROM @input AS i2 WHERE i2.Name <= a.Name) [rn] 
    FROM 
    (
     SELECT i.name, count(*) c 
     FROM @input i 
     GROUP BY i.name 
    )a 
)t1 
JOIN @t t ON t.n <= t1.rn 
WHERE t.n > t1.rn - t1.c 

它产生所需的输出:

name  n 
-------- ----------- 
Aryan 1 
Aryan 2 
Aryan 3 
Aryan 4 
Jaesmin 5 
Jaesmin 6 
Jaesmin 7 
Joseph 8 
Joseph 9 
Marya 10 
Padukon 11 
Padukon 12 
Vick  13 
Vicky 14 
Vicky 15 
Vicky 16 
+1

嗨,它像一个魅力..但你能请解释代码 – aditi

3

声明你的表变量作为

Declare @input TABLE(_id int identity(1, 1), Name VARCHAR(8)) 

然后reqrite查询作为

Select _id, name 
from @input 
where _id % 2 <> 0 
+0

如果我有一个Tally表(不干扰现有的@input表模式),那么我该如何做,例如声明@t table(n int) 插入@t select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9工会全选10工会全选11工会全部 选12工会全选13工会全选14工会全部 选择15工会全选16工会全选17工会全部 选择18工会全选19工会全选20 – aditi

+0

对不起,我不明白你在问什么,你能否重新提出这个问题? –

+0

这是[重要](http://support.microsoft.com/kb/273586)使用INSERT ... SELECT ... ORDER BY来填充此临时表,而不是'SELECT ... INTO ... ORDER BY'。 –