[英]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.