2015-09-30 4 views
0

У меня есть база данных Oracle 11g. Когда я выполняю запрос containsig WITH, он не показывает никакого результата.Как выполнить запросы CTE в Oracle 11g

Запрос:

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

Он возвращает что-то в SQL Fiddle: http://www.sqlfiddle.com/#!4/9eecb7d/7231. –

+0

Он тоже работает для меня (Oracle 11.2), и я не вижу причин, чтобы он не производил 10 строк. Может быть, ошибка в инструменте, который вы используете для извлечения данных? –

+0

Я использую эту версию Oracle. Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production –

ответ

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 

нотабене хотя он работает с определениями столбцов to_char(t1.p) и to_char(t2.p) старых/новых значений, те to_chars полностью избыточны, так как t1.p и t2.p уже являются строками (как определено в вашем подзапросе seq). Вот почему я удалил их в вышеуказанном запросе.


ETA: Если вы собираетесь использовать подзапрос факторинга (который является термин Oracle для КТР), почему бы не пойти до конца и поставить все ваши подзапросов в предложении WITH?

т.д .:

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); 

Несколько дополнительных вещей, чтобы заметить: а) я удалил ненужные внешнего запроса и б) я преобразовал свой старый стиль объединятся в стиле ANSI присоединиться.

+0

Да. Внешний запрос 'select old_value, new_value from()' также лишний. –

+0

@ThorstenKettner heh, да, я понял, что когда я конвертировал запрос, чтобы полностью использовать факторинг подзапросов! – Boneist

+0

@Boneist Выполняю ваш запрос, но он не показывает никакого результата. Я использую эту версию оракула: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production и версия PLSQL: PL/SQL Release 11.2.0.4.0 - Production –

Смежные вопросы