我有Oracle 11g数据库。当我执行查询containsig WITH
子句时,它不会显示任何结果。
查询:
WITH
seq AS (SELECT to_char(LEVEL) p
FROM dual CONNECT BY LEVEL <= 10)
SELECT old_value, new_value
FROM (SELECT to_char(t1.p) old_value,
to_char(t2.p) new_value
FROM (SELECT row_number() over(ORDER BY p) rn, p FROM seq) t1,
(SELECT row_number() over(ORDER BY dbms_random.random) rn,
p
FROM seq) t2
WHERE t1.rn = t2.rn);
执行此查询时,它不会显示任何记录:0 rows selected in 0.0078 seconds.
为什么结果为空?
答案 0 :(得分:0)
它适用于我11.2.0.2:
with seq as (select to_char (level) p
from dual
connect by level <= 10)
select old_value,
new_value
from (select t1.p old_value,
t2.p new_value
from (select row_number () over (order by p) rn, p from seq) t1,
(select row_number () over (order by dbms_random.random) rn, p
from seq) t2
where t1.rn = t2.rn);
OLD_VALUE NEW_VALUE
---------- ----------
1 7
10 5
2 4
3 6
4 3
5 8
6 1
7 2
8 9
9 10
N.B。虽然它适用于to_char(t1.p)
和to_char(t2.p)
旧/新值列定义,但那些to_chars完全是冗余的,因为t1.p和t2.p已经是字符串(在seq子查询中定义)。这就是我在上述查询中删除它们的原因。
ETA:如果你打算使用子查询因子分析(这是CTE的Oracle术语),为什么不把整个程序都放在WITH子句中呢?
E.g:
with seq as (select to_char (level) p
from dual
connect by level <= 10),
t1 as (select row_number () over (order by p) rn,
p
from seq),
t2 as (select row_number () over (order by dbms_random.random) rn,
p
from seq)
select t1.p old_value,
t2.p new_value
from t1
inner join t2 on (t1.rn = t2.rn);
需要注意的一些额外事项:a)我删除了不必要的外部查询,b)我将旧样式连接转换为ANSI样式连接。