sql - 为每一行选择随机值
问题描述
假设我有 2 个表名为“FOR_TEST_1”,列 A、B、C 和“FOR_TEST_2”列 D、E、F。
我想生成 A 列与 D 列中的随机值配对。
这是表格的片段。
到目前为止,这是我一直在做的语句,它为 A 中的每一行返回相同的 D 值。
目前我正在使用 toad for oracle,但我尝试在 MySQL 中使用相同的逻辑,它工作正常。
解决方案
您期望 Oracle 每行执行一次子查询(这是 MySQL 所做的)。但是,您似乎遇到了 Oracle 优化的副作用。主查询和标量子查询之间没有关联,因此 Oracle 决定取消嵌套子查询,执行一次并将结果连接到主查询。
要获得您想要的结果,您有几个选择。一种是使用提示关闭取消嵌套NO_UNNEST
。
select t1.a
, ( select d from ( select /*+ NO_UNNEST */ d from for_test_two
order by dbms_random.value ) where rownum = 1) d
from for_test_one t1
/
或者,您可以重写查询以使用内联视图而不是标量子查询。
select t1.a
, t2.d
from ( select a, rownum as rn
from for_test_one) t1
join ( select d, rownum as rn
from ( select d from for_test_two
order by dbms_random.value() ) ) t2
on t1.rn = t2.rn
order by t1.rn
/
警告:该NO_UNNEST
解决方案不适用于 SQL Fiddle 演示(在此处找到)。不知道为什么,语法看起来是正确的。因此,在您的环境中尝试一下,或者只使用第二种方法,这绝对有效。
推荐阅读
- asynchronous - Vue.js v-show 在 axios 之后不起作用
- database - Laravel(不仅如此)多对多关系 Belongs-To-All
- html - 固定 div 高度:移动设备上滚动未填满屏幕时为 100%
- twilio - 是否可以检测到谁在使用 Twilio Video JS SDK 说话?
- svn - SVN 最佳实践——开发人员的“私有”存储库?
- python - python 中的 Azure 计费 API
- windows-10 - windows 10 家庭基本功能错误
- database - 签名板 将签名存储在数据库中
- c# - T-SQL:合并或更新子表
- c# - Linq通用GroupBy日期和其他字段同时