繁体   English   中英

在查找表中的最大年龄时,SQL Server中出现Gettin错误

[英]Gettin error in SQL Server while finding out max age in a table

我们可以通过使用来尝试获得最大年龄

SELECT TOP 1 age FROM Head1 ORDER BY Age DESC

但我尝试在SQL Server中使用while循环

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 @a=@a+1;
end
print @maxo

错误

消息141,第15级,状态1,第5行
为变量赋值的SELECT语句不能与数据检索操作结合使用。

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

我有点被困在这里。 请帮帮人......

有两个问题:

问题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)

使用循环是低效的,如果你的表很大,它将产生性能瓶颈。

例外文本是不言自明的。

由于你无法在你指定@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 只有在查询只返回单行时,才能为变量赋值。

注意 - 使用循环是查找最大值的非常有效的方法。

起初我应该问你(@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;
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 @a=@a+1;
END
PRINT @name +  ',' + CAST(@maxo AS NVARCHAR(50))

替代方式是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM