单个SQL语句用于选择行,但仅限于恰好有一个匹配行

时间:2014-02-19 18:23:36

标签: sql sql-server

考虑以下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子句?

2 个答案:

答案 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