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'