2015-05-14 97 views
4

我们可以尝试通过简单地利用刚开误差最大年龄表

SELECT TOP 1 age FROM Head1 ORDER BY Age DESC 

以获得最大的年龄,但我已经尝试使用while循环在SQL Server

代码

declare @a int, @m int, @maxo int; 
set @maxo = 0; 
while(@a<10) 
begin 
    select name, @m = age from head1 where ID = @a; 
    if @m>@maxo 
     @maxo = @m; 
    set @[email protected]+1; 
end 
print @maxo 

错误

消息141,级别15,状态1,行5
将值赋予变量的SELECT语句不能与数据检索操作组合。

Msg 102,Level 15,State 1,Line 7
'@maxo'附近语法不正确。

我有点卡在这里。请帮助家伙.....

+0

请参阅:http://www.sql-server-helper.com/error-messages/msg-141.aspx –

+0

很高兴你发现所有的答案有帮助!但是,您只能给*一个*接受*标记。由于你选择的最后一个答案也是一个重复的帖子,所以我删除了那个给你另一个选择一个*帖子的机会,作为最能帮助你的那个。 :-) –

回答

1
declare @a int, @m int, @maxo int 
declare @name NVARCHAR(100) 
set @maxo = 0; 
while(@a<10) 
begin 
    select @name = name, @m = age from head1 where ID = @a; 
    if @m>@maxo 
     SET @maxo = @m; 
     set @[email protected]+1; 
END 
PRINT @name + ',' + CAST(@maxo AS NVARCHAR(50)) 

另一种方法是

SELECT Name, Age FROM Header1 WHERE Age = (SELECT MAX(Age) FROM Header1) 
3

异常文本是不言自明的。

因为你不能在你指定@m相同的语句检索name(实际上是你没有使用这个name任何地方 - 所以看起来你并不需要它),你必须改变这条线

select name, @m = age from head1 where ID = @a; 

select @m = age from head1 where ID = @a; 

或者,如果你真的需要一些名字,它应该被分配到一些变量太多,不仅选择:

select @n = name, @m = age from head1 where ID = @a; 

但一般情况下这是行不通的,因为在head1中可以有多个记录符合条件ID = @a。赋值给变量只有在查询只返回单行时才有效。

注 - 使用循环是非常寻找最大值的不寻常方式。

5

这里有两个问题:

问题1:

你所得到的错误是自我解释,即,当你在分配值变量你不能选择列。

可以解决这个问题是这样的:

select @name = name, @m = age from head1 where ID = @a; 

问题2:

在此我不认为你需要查询所有找到从表中最大的年龄。你可以简单地使用MAX()函数来寻找最大年龄从表中这样

SELECT Name, Age FROM Head1 WHERE Age = (SELECT MAX(Age) FROM Head1) 

使用循环是低效的,以及如果你的表是巨大的,它将创建一个性能瓶颈。

2

起初我应该问你关于(@a<10),它应该是始终10?,我认为这是你的表的行数,你把它像这样:

DECLARE @rows bigint 
SET @rows = (SELECT COUNT(1) FROM head1) 

然后使用它; (@a < @rows)


现在第二个问题是,您使用ID = @a这是为表或删除空白行的无效条款。为了解决这个问题,使用这种子句,你应该一次又一次地找到一个max(ID)


我可以建议您使用此查询,但没有WHILE

DECLARE @max int 
SET @max = 0 

SELECT @max = CASE WHEN @max < age THEN age ELSE @max END 
FROM head1 

如果你想在你的方式来使用WHILE,你需要在你的代码ROW_NUMBER()场这样的:

SET @m = (SELECT h1.age 
      FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY head1.age) AS rn 
       FROM head1) h1 
      WHERE h1.rn = @a; 

,而不是

select name, @m = age from head1 where ID = @a;