Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中排列值_Sql_Oracle_Permutation - Fatal编程技术网

在SQL中排列值

在SQL中排列值,sql,oracle,permutation,Sql,Oracle,Permutation,假设我有一个包含两列的表: id | value ---------- 1 | 101 2 | 356 3 | 28 我需要随机排列value列,以便从现有集合{101356,28}中随机为每个id分配一个新值。如何在Oracle SQL中实现这一点 这听起来可能有点奇怪,但这是一个真正的问题,只是有更多的列。您可以通过使用带有随机数生成器的row\u number()来实现这一点,然后连接回原始行: with cte as ( select id, value,

假设我有一个包含两列的表:

id | value
----------
 1 | 101
 2 | 356
 3 |  28
我需要随机排列value列,以便从现有集合{101356,28}中随机为每个id分配一个新值。如何在Oracle SQL中实现这一点


这听起来可能有点奇怪,但这是一个真正的问题,只是有更多的列。

您可以通过使用带有随机数生成器的
row\u number()
来实现这一点,然后连接回原始行:

with cte as (
      select id, value,
             row_number() over (order by id) as i,
             row_number() over (order by dbms_random.random) as rand_i
      from table t
     )
select cte.id, cte1.value
from cte join
     cte cte1
     on cte.i = cte.rand_i;
这保证了置换(即,没有原始行的值被使用两次)

编辑:

顺便说一下,如果原始的
id
s是从1开始的序列,并且没有间隙,您可以执行以下操作:

select row_number() over (order by dbms.random) as id, value
from table t;

一个选项:
select*from x_table,其中id=round(dbms_random.value()*3)+1[这里3是随机数据表中的行数,我假设id是递增的且唯一的?]


我会考虑其他选项。

我不确定这是否是SQL数据库的正确任务。也许您应该实现如下内容:

-在PL/SQL中,然后通过
管道行
构造返回光标。对于大型数据集,按dbms.random排序可能会很慢