随机的T-SQL返回多行,其中一行是预期的

时间:2017-03-14 14:03:03

标签: sql sql-server database tsql random

考虑以下从表变量中获取随机行的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时,问题就会消失。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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没有空白。这可能是你没有获得任何行的另一个原因。

答案 1 :(得分:4)

要获得一个随机行,您可以执行此操作

SELECT TOP 1
    PriceClasses.RowIndex,
    PriceClasses.PriceClassID 
FROM
    @priceClasses AS PriceClasses
ORDER BY
    NEWID();

虽然@GordonLinoff是正确的,但该要求有一个更简单的解决方案