Oracle 多个 "with as" 问题
Oracle multiple "with as" issue
我正在使用 Oracle 12.c 企业版 (12.1.0.2.0)。
我想构建一个随机数的行(这里是 4 到 15 行)- 称为 DataSet - 使用 2 个随机(1 到 30 之间)- 称为 FixedSed...
...并希望 2 个 FixedSet 数据(val1 和 val2)在 DataSet 中保持不变。
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
所有这一切的重点是 return val 为负时的 val1 和 val 为正时的 val2...
我应该改变什么?
谢谢
如果您希望每个 DataSet
行
的常数值为 FixedSet
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;
替代方法是将 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
我正在使用 Oracle 12.c 企业版 (12.1.0.2.0)。
我想构建一个随机数的行(这里是 4 到 15 行)- 称为 DataSet - 使用 2 个随机(1 到 30 之间)- 称为 FixedSed...
...并希望 2 个 FixedSet 数据(val1 和 val2)在 DataSet 中保持不变。
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
所有这一切的重点是 return val 为负时的 val1 和 val 为正时的 val2...
我应该改变什么? 谢谢
如果您希望每个 DataSet
行
FixedSet
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;
替代方法是将 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