[英]Single SQL statement to select row, but only if there is exactly one matching row
考慮以下SQL:
SELECT @Count = COUNT(*)
FROM Widgets
WHERE WidgetName = 'foo'
IF ( @Count = 1 ) BEGIN
SELECT @WidgetId = WidgetId
FROM Widgets
WHERE WidgetName = 'foo'
END
它有效地設置了@WidgetId
值,但@WidgetId
是只有一個匹配的行滿足查詢。 上面的查詢很簡單,但考慮WHERE子句相當昂貴的情況。 或者,如果WHERE子句比單個完整列更復雜。 ( WHERE WidgetName LIKE '%foo%'
)有沒有辦法進行單個查詢以將值賦給參數,但只有當一行匹配時才會重復,而不重復WHERE子句?
如果我理解正確,您可以使用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/0303/21
這將起作用,並且不需要您執行多個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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.