【问题标题】:Get a random value from a range in MS SQL?从 MS SQL 的范围中获取随机值?
【发布时间】:2011-08-23 01:33:28
【问题描述】:

假设我的表的值可以从 000 到 999(三位数且小于 1000)

其中一些值已填充。假设目前我的桌子有

000,002,005,190(001,004,003,006,..189,191,..,999 可以插入表格)

这些值是随机分配的,000和002在表中,但001还没有在表中。

我怎样才能获得可以插入到表格中的值。

【问题讨论】:

  • 是否有任何大于 1000 的 3 位数字?
  • 如果数字不能重复,则不需要对表格进行大小限制。
  • 是的,数字不能重复,但我们有 999 个限制。
  • 啊,好的,所以表格永远不可能包含所有 1000 个三位非负十进制整数。

标签: sql-server-2008 tsql


【解决方案1】:
DECLARE @t TABLE
(VALUE CHAR(3))

INSERT @t
VALUES
('000'),('002'),('005'),('190')


;WITH rnCTE
AS
(
    SELECT -1 + ROW_NUMBER() OVER (ORDER BY TYPE, number, name) AS rn
    FROM master.dbo.spt_values
)
SELECT RIGHT('000' + CAST( rn AS VARCHAR(11)),3)
FROM rnCTE
WHERE NOT EXISTS    (   SELECT 1 FROM @t 
                        WHERE VALUE = rn
                    )
AND rn < 1000

编辑

此查询通过从系统表 (master.dbo.spt_values) 生成可能数字的完整列表来工作,该表保证在 CTE rnCTE 中包含超过 1000 行。 -1 添加到 ROW_NUMBER 以使值从 0 而不是 1 开始。

外部查询补零显示的数字,只返回那些不在源数据中且小于 1000 的数字。

【讨论】:

  • 我通过编写以下查询解决了这个问题。声明@count int; select @count= 000 create TABLE #Temporary_tbl ( stylecode decimal--varchar(20) ) WHILE @count
  • @Zain - 编辑了答案以解释它是如何工作的。由于它使用WHILE 循环,因此优化您的解决方案的余地不大 - 我建议的解决方案是基于集合的,应该更有效。
【解决方案2】:
DECLARE @t TABLE(id INT)
INSERT INTO @t (id) 
VALUES 
(1),(19),(3)

;WITH numbers AS (
SELECT ROW_NUMBER() OVER(ORDER BY o.object_id,o2.object_id) RN FROM sys.objects o
CROSS JOIN sys.objects o2
),  NotExisted AS(
SELECT * FROM numbers WHERE RN NOT IN (SELECT ID FROM @t)
AND RN<1000)
SELECT TOP 1 RN FROM NotExisted ORDER BY NEWID()

【讨论】:

    【解决方案3】:

    您必须编写一个 T-SQL 来进行第一次查询并找出差距。没有现成的 SQL 可以直接为您提供差距。

    【讨论】:

    • 好的,您能指导我如何编写查询以查找差距吗?
    猜你喜欢
    • 2018-05-15
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2021-12-15
    • 2012-10-30
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多