2016-03-07 90 views
0

請考慮一個表,其中包含一列具有100行相同值且另一列具有唯一性的列。同時使用select查詢來檢索哪個row_th值返回的值。對於包含相同列的查詢,返回哪個值

這裏是我的表結構:

id column_1 
1  q 
2  q 
3  q 
4  q 
.  . 
.  . 
100  q 

這裏是我的查詢:

DECLARE @UserId INT 
SELECT @UserId = Table_1.column_2 FROM [Table_1] WHERE [Table_1].[Column_1] = 'q' 
     select @UserId 
it returns 100 th row value, 

能告訴我爲什麼這個值來代替它匹配條件的第一個標識?

+1

您不指定ORDER BY,因此記錄可以按任何順序生成,具體取決於生成的查詢計劃。 –

回答

0
SELECT @UserId = Table_1.column_2 FROM [Table_1] WHERE [Table_1].[Column_1] = 'q' 

這產生100結果行,每一個重新分配@UserId。

看來最後一個記錄採摘是一個與值100,所以

select @UserId 

收益100它可能是從表中其他任何價值,因爲你沒有指定的次序讀記錄,但是(即沒有0​​條款)。

但爲什麼你選擇所有記錄?你只對一個記錄感興趣,你想把這個記錄放入變量中。因此,請只選擇一個結果值,例如:

SELECT @UserId = MIN(column_2) FROM Table_1 WHERE Column_1 = 'q' 
0

當您將值分配給SELECT子句中的變量時,根據結果的排序順序,將查詢返回的所有值從第一個分配到最後一個。

在這種情況下,返回100行時,分配給變量的值將是結果集中的最後一個值,即第100行的值。

如果要分配符合條件的第一個值,請使用TOP關鍵字來限制返回的行數。請記住,如果沒有明確的ORDER BY子句,則不能保證輸出的排序順序,所以如果需要一致的結果,最好添加它。

實施例:

DECLARE @UserId INT; 
SELECT TOP(1) @UserId = Table_1.column_2 
FROM [Table_1] 
WHERE [Table_1].[Column_1] = 'q' 
ORDER BY id; 
相關問題