对于包含相同列

时间:2016-03-07 10:21:16

标签: sql sql-server tsql

考虑一个包含一列的表,该列具有相同的100行值和另一列唯一值。使用select查询来检索返回值的行值。

这是我的表结构:

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,

我可以知道为什么这个值来自而不是匹配条件的第一个id?

2 个答案:

答案 0 :(得分:0)

当您为SELECT子句中的变量赋值时,根据结果的排序顺序,查询返回的所有值将从第一个到最后一个逐个分配给变量。 / p>

在这种情况下,返回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;

答案 1 :(得分:0)

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

这会产生100个结果行,每个行重新分配@UserId。

最后选择的记录似乎是值为100的记录,所以

select @UserId

返回100.它可能是表中的任何其他值,因为您没有指定读取记录的顺序(但是没有ORDER BY子句)。

但是你为什么还要选择所有唱片呢?您只对一条记录感兴趣,该记录是您要将其放入变量的值。因此,只选择一个结果值,例如:

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