我们可以通过使用
来尝试获得最大年龄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'附近的语法不正确。
我有点被困在这里。请帮助伙计.....
答案 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)