回答

收藏

随机选择并不总是返回单行

技术问答 技术问答 207 人阅读 | 0 人回复 | 2023-09-12

遵循(简化)代码片段的目的是返回 一个随机行    。不幸的是,当我们在查询分析器中运行这个片段时,它的返回结果在零到三个之间。
5 f9 e2 o! l. C9 h2 d因为我们的输入表只有五个ID当我们在这个表中执行时ID 等于    选择随机数时,我们感到困惑的是,会有不止一条线回来。5 N1 U) s+ b3 w4 o# d  p0 N4 i
注:除此之外,我们还试图将验证和结果转换为无用的整数。3 b2 d4 \% O/ l: @0 J- Z- x
DECLARE @Table TABLE (  ID INTEGER IDENTITY ,FK1 INTEGER)INSERT INTO @TableSELECT 1UNION ALL SELECT 2UNION ALL SELECT 3UNION ALL SELECT 4UNION ALL SELECT 5SELECT  *FROM    @Table WHERE   ID = ABS(CHECKSUM(NEWID())编辑我们的使用场景如下所示(请不要评论是否正确。这是决定的力量)7 x. M7 W3 h5 V' C0 P
最终,我们必须创建一个具有 实际    值的结果是从表本身中随机选择现有权重混淆    生产者与权重的结合。8 e, ?% O: ]) T; }* a6 Y* d' ~
然后查询就会变成这样(也是这样(RAND不能使用的原因)6 w7 c: s/ P( |) {2 z3 v
SELECT  t.ID        ,FK1 = (SELECT FK1 FROM @Table WHERE ID=ABS(CHECKSUM(NEWID())FROM    @Table t因为内部选择可能会返回零结果,所以它次返回NULL值,这是不可接受的。原因是为什么内部选择是零和x结果之间返回的调查(这甚至是英语吗?)。! B9 j$ k0 n) Q' n: d2 n) Z
回答对我来说,亮起的ABS(CHECKSUM(NEWID())每一行
4 [& `; V% ~% U  Y简单观察重新评估。我的印象是,ABS(CHECKSUM(NEWID()) 5   1)应首先评估  一次    ,然后匹配。
6 e/ i! ~: {& X# ~3 W. p( B. F谢谢你的回答。虽然很慢,但的能让我更好的理解。
5 I# R" e1 h& ]0 _                                                                ( Y; L: L; E9 x1 v/ d2 \& k
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则