使用子查询提取随机值每次都显示相同的值
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 - 是的,我同意以上是关于使用子查询提取随机值每次都显示相同的值的主要内容,如果未能解决你的问题,请参考以下文章
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,不允许?