簡體   English   中英

單個SQL語句用於選擇行,但僅限於恰好有一個匹配行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM