Oracle多个“ with as”问题

时间:2019-08-30 10:39:36

标签: sql oracle12c common-table-expression

我正在研究Oracle 12.c企业版(12.1.0.2.0)。

我想构造一个随机的行数(在4到15行之间)-称为DataSet-使用2个随机的行(在1-30之间)-称为FixedSed ...

...并希望2个FixedSet数据(val1和val2)在数据集中是恒定的。

with DataSet as
(
select level Ident
     , trunc(dbms_random.value(0,1)*100)-10 val
  from dual
CONNECT BY level <= dbms_random.value(4, 15)
)
, FixedSet as
(
  select trim(trunc(dbms_random.VALUE(1, 30))) val1
       , trim(trunc(dbms_random.VALUE(1, 30))) val2
    from dual
)
select *
  from DataSet, FixedSet

例如:

IDENT   VAL VAL1    VAL2
1       -1     6      13
2       78     6       5
3       68     7      22
4       86    19      29
5       37    15       8
6       -1     8      18
7        0     1      21
8       77    24      19
9       18    15      13
10       4    13      28
11      70     7      29

我希望我得到类似的东西:

IDENT   VAL VAL1    VAL2
1        -1    6      13
2        78    6      13
3        68    6      13
4        86    6      13
5        37    6      13
6        -1    6      13
7        0     6      13
8        77    6      13
9        18    6      13
10       4     6      13
11       70    6      13

所有这些的目的是当val为负时返回val1,如果为正则返回val2 ...

我应该改变什么? 谢谢。

2 个答案:

答案 0 :(得分:1)

如果您想要每FixedSet行的DataSet恒定值

with FixedSet as
(
  select level lfs, trim(trunc(dbms_random.VALUE(1, 30))) val1
       , trim(trunc(dbms_random.VALUE(1, 30))) val2
    from dual
    connect by level <=1
)
, DataSet as
(
select level Ident
     , trunc(dbms_random.value(0,1)*100)-10 val
  from dual
CONNECT BY level <= dbms_random.value(4, 15)
)
select *
  from DataSet, FixedSet;

答案 1 :(得分:1)

替代方法是将val1和val2添加为列定义的一部分

with DataSet as
(
select level Ident
     , trunc(dbms_random.value(0,1)*100)-10 val
  from dual
CONNECT BY level <= dbms_random.value(4, 15)
)
select t.*
       ,(select dbms_random.value(1,30) from dual) as val1
       ,(select dbms_random.value(1,30) from dual) as val2
  from DataSet t

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9bd7e8952ce27be660c294069d6afe21