如何在Oracle 11g中执行CTE查询

时间:2015-09-30 10:28:52

标签: sql oracle oracle11g common-table-expression

我有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.

为什么结果为空?

1 个答案:

答案 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样式连接。