考虑以下SQL:
SELECT @Count = COUNT(*)
FROM Widgets
WHERE WidgetName = 'foo'
IF ( @Count = 1 ) BEGIN
SELECT @WidgetId = WidgetId
FROM Widgets
WHERE WidgetName = 'foo'
END
它有效地设置@WidgetId
值,但前提是完全一个匹配的行满足查询。上面的查询很简单,但考虑WHERE子句相当昂贵的情况。或者,如果WHERE子句比单个完整列更复杂。 (WHERE WidgetName LIKE '%foo%'
)有没有办法进行单个查询以将值赋给参数,但只有在恰好一行匹配时,才重复WHERE子句?
答案 0 :(得分:2)
如果我理解正确,您可以使用HAVING
子句成功地仅在COUNT
等于1时设置@WidgetId变量。这样的事情应该有效:
SELECT @WidgetId = MAX(WidgetId)
FROM Widgets
WHERE WidgetName = 'Widget Name'
GROUP BY WidgetName
HAVING COUNT(*) = 1
在上面的例子中,如果WidgetName分组后只有COUNT
的一条记录,@ WidgetId将被设置为MAX(WidgetId)。
我在这里创建了一个小提琴:http://www.sqlfiddle.com/#!6/0e303/21
答案 1 :(得分:1)
这将起作用,并且不需要您执行多个SELECT语句。 如果您需要,您可以自由地更改查询,而不会破坏任何内容。
SELECT @WidgetId = WidgetId
FROM Widgets
WHERE WidgetName = 'foo'
IF @@ROWCOUNT = 1
BEGIN
--Here you are certain that there's only one matching row found
END
ELSE
BEGIN
--Here zero or more than one records were found
END