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

时间:2015-05-14 09:44:42

标签: sql sql-server

我们可以通过使用

来尝试获得最大年龄
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

错误

  

Msg 141,Level 15,State 1,Line 5
   为变量赋值的SELECT语句不能与数据检索操作结合使用。

     

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

我有点被困在这里。请帮助伙计.....

4 个答案:

答案 0 :(得分:5)

有两个问题:

问题1:

您获得的错误是自我解释的,即您在将值分配给变量时无法选择列。

您可以这样解决:

SELECT *
FROM   table
WHERE  id IN (SELECT id
          FROM   table
          WHERE  description = 'A')
   AND description = 'B' 

问题2:

在此我不认为您需要该查询才能从表中找到最大年龄。你可以简单地使用max()函数从你的表中找到最大年龄

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

使用循环是低效的,如果你的表很大,它会造成性能瓶颈。

答案 1 :(得分:3)

异常文字不言自明。

由于您无法在指定name的同一语句中检索@m(实际上您在任何地方都没有使用此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的记录可能会有多个。只有在查询只返回单行时才能为变量赋值。

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

答案 2 :(得分: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;

答案 3 :(得分: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 @a=@a+1;
END
PRINT @name +  ',' + CAST(@maxo AS NVARCHAR(50))

替代方式

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