使用子查询提取随机值每次都显示相同的值

Posted

技术标签:

【中文标题】使用子查询提取随机值每次都显示相同的值【英文标题】:Using subquery to pull random value reveals same value every time 【发布时间】:2011-07-29 07:19:17 【问题描述】:

我想使用 Microsoft SQL Server 2008 R2 的 T-SQL 向查询中的列添加随机值。为此,我使用子查询并拉取随机记录。每次我运行查询时,它都会拉出一条新的随机记录,但每一行的值都是相同的。

如何为每一行获取一个新的随机值?

示例查询:

SELECT column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 ORDER BY NewID())
FROM Table1

而 table2 看起来像

column1
value1
value2
value3

它总是为 column2 返回相同的值,而不是为每个表返回一个新的随机记录。

第一次运行:

column1, c2
1, value1
2, value1
3, value1

第二次运行:

column1, c2
1, value2
2, value2
3, value2

如何让 c2(子查询)为每一行提取一个新的随机记录?

理想场景:

column1, c2
1, value2
2, value1
3, value2

【问题讨论】:

您可能需要引用外部查询,以便 SQL Server 认为它是相关的。不过,这将是非常低效的。这里有什么要求? 谢谢@PeterSchofield,我的意思是 2008 r2。 【参考方案1】:

试试:

SELECT column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 WHERE Table1.column1 IS NOT NULL ORDER BY NewID())
FROM Table1

【讨论】:

我猜这是性能最高的选项,因为它不需要任何文本解析功能。谢谢。 更新语句也是如此。例如。 update table set fkId = (select top 1 id from otherTable order by newId(),将是 update t1 set fkId = (select top 1 t2.id from otherTable t2 where t1.col = t2.col order by newId() from table t1【参考方案2】:

你可以试试

SELECT T1.column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 ORDER BY NewID(), LEN(T1.column1))
FROM Table1 T1

强制它每次重新评估选择。但这将是非常低效的。也很脆弱(没有LEN 它不起作用!)是否满足您对T2 值随机排序一次(或者如果Table1 大于Table2 可能更多)然后按row_number 加入的要求?

我可以看到这些方法的主要区别是,您当前的方法将允许多次选择相同的随机行,而我建议的方法不会。

【讨论】:

Inefficient 正好适合这种情况,所以应该可以完美运行! 感谢提及再评价;这是问题的核心,也是最好的答案。 效果很好,而且像宣传的那样慢:) 但是 len 函数不应该是第二列排序吗?首先按 int 的长度排序,然后按随机数排序会产生有趣的聚类随机化模式,当然不是最佳分布。 @dlatikay - 是的,我同意

以上是关于使用子查询提取随机值每次都显示相同的值的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 子查询 嵌套查询 多值子查询

sql 问题子查询返回的值不止一个。

在MS访问中的子表单上显示查询结果

子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,不允许?

Sql Server 查询,一共三列,怎样查出第一个列值相同,第二列值最大的第三列的值?

随机查询每次返回相同的记录