我正在寻找生成一个随机数,该随机数不在另一张桌子上。 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