簡體   English   中英

帶有隨機的T-SQL返回多行,期望其中的一行

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

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