2016-03-07 93 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; 
相关问题