Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当你期望一个单一的结果时,“选择前1名”真的是获得单一结果的最佳方式吗?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 当你期望一个单一的结果时,“选择前1名”真的是获得单一结果的最佳方式吗?

Sql 当你期望一个单一的结果时,“选择前1名”真的是获得单一结果的最佳方式吗?,sql,sql-server,tsql,Sql,Sql Server,Tsql,每当我期望一个需要存储在变量中的单一结果时,我会执行如下操作 DECLARE @id INT = SELECT TOP 1 [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'; 因为如果我这样做,SQL Server会抱怨 DECLARE @id INT = SELECT [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'; 即使保证最多有一个结果,例如,[Name]有一个唯一的约束 我想知道有没有更

每当我期望一个需要存储在变量中的单一结果时,我会执行如下操作

DECLARE @id INT = SELECT TOP 1 [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry';
因为如果我这样做,SQL Server会抱怨

DECLARE @id INT = SELECT [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry';
即使保证最多有一个结果,例如,[Name]有一个唯一的约束

我想知道有没有更合适的方法。例如,在C LINQ中有Single或SingleOrDefault,如


哪个更具表现力。

您的语法无效。如果最多有一行,则此选项应起作用:

DECLARE @id INT = (SELECT [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry');
如果您只想成为额外的,您可以添加前1,确保不会出现运行时错误


记住:子查询总是需要自己的括号。

您的语法无效。如果最多有一行,则此选项应起作用:

DECLARE @id INT = (SELECT [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry');
如果您只想成为额外的,您可以添加前1,确保不会出现运行时错误


记住:子查询总是需要自己的括号。

戈登也说过括号。现在考虑下面的SQL,请注意我的评论:

-- create table with one 'harry'
DECLARE @stuff TABLE (id int identity, name varchar(100));
INSERT @stuff VALUES ('harry');

-- this will succeed, SQL will NOT complain
DECLARE @id int = (SELECT id FROM @stuff WHERE name = 'harry')

-- add another 'harry'
INSERT @stuff VALUES ('harry');

-- this will fail because the subquery returns 2 rows
DECLARE @ids int = (SELECT id FROM @stuff WHERE name = 'harry');

请记住,如果没有随附的ORDERBY子句,TOP语句的结果不能保证总是相同的

戈登对括号的看法也是如此。现在考虑下面的SQL,请注意我的评论:

-- create table with one 'harry'
DECLARE @stuff TABLE (id int identity, name varchar(100));
INSERT @stuff VALUES ('harry');

-- this will succeed, SQL will NOT complain
DECLARE @id int = (SELECT id FROM @stuff WHERE name = 'harry')

-- add another 'harry'
INSERT @stuff VALUES ('harry');

-- this will fail because the subquery returns 2 rows
DECLARE @ids int = (SELECT id FROM @stuff WHERE name = 'harry');

请记住,如果没有随附的ORDERBY子句,TOP语句的结果不能保证总是相同的

如果确定查询只返回一条记录,则可以使用:

声明@id INT

从[Stuff]中选择@id=[id],其中[Stuff].[Name]='Harry'


如果确定查询只返回一条记录,则可以使用:

声明@id INT

从[Stuff]中选择@id=[id],其中[Stuff].[Name]='Harry'