2016-11-08 71 views
0

每當我想到一個結果,我需要在一個變量我做類似如果您希望獲得單一結果,「SELECT TOP 1」是否是獲得單一結果的最佳方法?

DECLARE @id INT = SELECT TOP 1 [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'; 

存儲,因爲SQL Server抱怨,如果我這樣做,即使它是保證有

至多爲1結果(因爲,例如,[Name]具有UNIQUE約束)。

我想知道是否有一個更合適的方式做到這一點。例如,在C#LINQ有SingleSingleOrDefault,像

var id = context.Stuff.Single()?.Name; 

這是更有表現力。

回答

2

您的語法無效。如果在最一行這應該工作:

DECLARE @id INT = (SELECT [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'); 

您可以添加TOP 1,如果你只是想成爲額外的,額外確保不得到一個運行時錯誤。

記住:子查詢總是需要自己的括號。

0

這個怎麼樣如下─多行的情況下,它會留給你的最後的值,查詢正巧遇到

DECLARE @id INT; 
SELECT @id = [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'; 

我不知道它的好,壞,或無不同於你的想法 - 如果有很多'哈利',可能會更糟糕

0

同上Gordon對括號的說法。現在考慮下面的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'); 

請記住,如果沒有伴隨ORDER BY子句,TOP語句的結果不能保證始終是相同的。

0

,如果你確定你的查詢將返回只有一個記錄,你可以使用:

DECLARE @id INT

選擇@id = [ID] FROM [東西],其中[東西] 。[Name] ='Harry';