[英]T-SQL with random returns multiple rows where one is expected
請考慮以下T-SQL代碼(MS SQL Server 2014),該代碼從表變量中獲取隨機行:
DECLARE @priceClasses TABLE (
RowIndex INT,
PriceClassID NVARCHAR(MAX))
;
INSERT INTO @priceClasses VALUES
(0, 'RETAIL')
,(1, 'WHOLESALE')
,(2, 'WHOLESALE2')
;
DECLARE @priceClassesCount AS INT;
SET @priceClassesCount = (SELECT COUNT(*) FROM @priceClasses);
SELECT
PriceClasses.RowIndex,
PriceClasses.PriceClassID
FROM
@priceClasses AS PriceClasses
WHERE
PriceClasses.RowIndex = ABS(CHECKSUM(NEWID())) % @priceClassesCount;
由於某種原因,最后一個SELECT
語句有時返回0行,有時返回1、2或3行。
這對我來說沒有意義。 該列的值是唯一的,並且ABS(CHECKSUM(NEWID())) % @priceClassesCount
不能為多值,可以嗎?
當我宣布這個問題消失RowIndex INT NOT NULL PRIMARY KEY
,而不是僅僅RowIndex INT
。 有什么想法嗎?
WHERE
子句每行評估一次。 那就是NEWID()
的美。 您的情況的悲劇之美。
如果要使用此方法,則最好將值存儲在變量中:
DECLARE @priceClassesCount AS INT;
SET @priceClassesCount = (SELECT COUNT(*) FROM @priceClasses);
SET @RowIndex = 1 + (ABS(CHECKSUM(NEWID())) % @priceClassesCount)
SELECT pc.RowIndex, pc.PriceClassID
FROM @priceClasses pc
WHERE pc.RowIndex = @RowIndex;
希望RowIndex
沒有任何空白。 這可能是您沒有行的另一個原因。
要獲得一個隨機行,您可以執行此操作
SELECT TOP 1
PriceClasses.RowIndex,
PriceClasses.PriceClassID
FROM
@priceClasses AS PriceClasses
ORDER BY
NEWID();
盡管@GordonLinoff是正確的,但該要求具有更簡單的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.