回答

收藏

生成一个不在SQL Server表中的随机数

技术问答 技术问答 252 人阅读 | 0 人回复 | 2023-09-14

我正在寻找生成一个随机数,该随机数不在另一张桌子上。
2 R" W' G, m- A( F1 `例如:如果一个表称为randomNums具有值10,20,30,40,50。4 Q/ h; Y  R4 R. j8 f
除上述值外,我还想生成一个数字。' c; K5 g7 e/ [
我尝试了以下查询。: [5 e; e( Q0 m$ c$ R8 A
询问
& N) n& u0 Q  e- \. N' J;WITH CTE AS
$ {) ]/ H$ t- t(
/ C! Z) {. _4 h: e$ `; d" v& h5 ^    SELECT FLOOR(RAND()*100) AS rn
) }5 {% ~" t3 B* c; {)
1 X2 r2 H9 ?8 k5 [1 MSELECT rn FROM CTE  z5 o( D! Z% Y2 |7 t
WHERE rn NOT IN (SELECT num FROM randomNums);9 m: O1 R  w% k) q- i, `
但是有时此查询不返回任何内容。
5 G7 v" p4 h! W+ ?2 T2 F因为那时候它生成表中存在的数字randomNums。& L! s  E; g0 L7 r* e1 u  }; |
如何解决这个问题?
7 O- v5 d9 y$ t$ [, G# V小提琴供参考
! K' P- O9 I$ N; c4 y& M. p4 u9 _' p               
0 C) d& t3 A  p& @: c解决方案:
  N/ K& g! X! k0 B                . O+ B8 ?% K# c/ t

( j* d; K; n# T1 D) l2 o$ B# a' a, g2 x9 \4 g' w
                另一个选择,我一直喜欢NEWID()随机排序,并且交叉联接非常有效地创建了许多行:
8 X& d7 W. ?% W' m4 D. j8 D; I;with cte AS (SELECT 1 n UNION ALL SELECT 1)4 ~0 g6 W& y. T# z8 B  I* k7 H
     ,cte2 AS (SELECT TOP 100 ROW_NUMBER() OVER(ORDER BY a.n) n& Q3 k" N8 o( n5 }8 H1 N4 l- h
               FROM cte a,cte b,cte c,cte d, cte e, cte f, cte g)
8 X& z4 @2 U8 ^( n( D1 Z2 G1 N$ aSELECT TOP 1 n
/ x1 ]. F7 L+ y8 ]2 M) eFROM cte2 a5 X' B+ J2 O1 s- e
WHERE NOT EXISTS (SELECT 12 o. d: k: l: O5 d$ \
                  FROM randomNums b1 D0 t4 i  i, T! P( y
                  WHERE a.n = b.num)
5 M* X% C2 w- [8 [6 X, T0 xORDER BY NEWID()
, ?2 `8 P* Q; l" F. e! P' d演示:SQL Fiddle
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则