2015-05-14 70 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;