"раскручивание" иерархии при соединение таблицы саму на себя

bloodrain
Дата: 26.11.2009 16:43:23
Нужно соединить таблицу саму с собой что б результат имел вид

т1.ид1 т2.ид т1.версия т2.версия
1 нул 1 нул
1 1 2 1
1 1 3 2

При этом версии могут начинаться не с 1цы. Запись может быть только одна, может быть много( отличаются только версиями )
suPPLer
Дата: 26.11.2009 16:58:00
bloodrain,

а теперь - с исходными данными и более развёрнутым результатом.
bloodrain
Дата: 26.11.2009 17:21:54
suPPLer,

Исходные данные

id ver

1 1
1 2
1 3
1 4
1 5
1 6

Желаемый результат:

id1 id2 ver1 ver2
1 1 1 Null
1 1 2 1
1 1 3 2
1 1 4 3
1 1 5 4
1 1 6 5

Вот что сделал:
select p1.id AS id1, p2.id AS id2, p1.ver as ver1, p2.ver as ver2 from table1 p1, table1 p2
where p1.id= p2.id
and  p1.ver = p2.ver(+) + 1

and p1.id = 1
and p2.id = 1
Но пока не хватает первого нула.
suPPLer
Дата: 26.11.2009 17:39:15
bloodrain,

тут и без соединения можно.

with t as (select 1 id, level ver from dual connect by level <= 6)
select id, id, ver, lag(ver) over(order by ver)
  from t
 where id = 1;
bloodrain
Дата: 26.11.2009 17:49:10
suPPLer,
Там вопрос в том что очень много таблиц друг с другом вяжутся. А как в джоини прикрутить
аналитические функции я не знаю :(
suPPLer
Дата: 26.11.2009 17:51:09
А с соединениями без тестовой таблички лично у меня выходит бред. Чего-то там оптимизируется слишком, и одна строка вообще без значений ID получается.

Присоединен к:
Oracle Database 11g Release 11.2.0.1.0 - Production

SQL> with t as (select 1 id, level ver from dual connect by level <= 6)
  2  select t1.id id1, t1.id id2, t1.ver ver1, t2.ver ver2
  3    from t t1, t t2
  4   where t1.id = 1
  5     and t1.id = t2.id (+) and t1.ver - 1 = t2.ver (+)
  6  ;

       ID1        ID2       VER1       VER2
---------- ---------- ---------- ----------
                               1
         1          1          2          1
         1          1          3          2
         1          1          4          3
         1          1          5          4
         1          1          6          5

6 строк выбрано.

SQL> with t as (select 1 id, level ver from dual connect by level <= 6)
  2  select t1.id id1, t1.id id2, t1.ver ver1, t2.ver ver2
  3    from t t1 left join t t2 on t1.id = t2.id and t1.ver = t2.ver + 1 
  4   where t1.id = 1;

       ID1        ID2       VER1       VER2
---------- ---------- ---------- ----------
                               1
         1          1          2          1
         1          1          3          2
         1          1          4          3
         1          1          5          4
         1          1          6          5

6 строк выбрано.

SQL> 

Зато с тестовой табличкой всё отлично.
create table test as select 1 id, level ver from dual connect by level <= 6;

select t1.id id1, t1.id id2, t1.ver ver1, t2.ver ver2
  from test t1 left join test t2 on t1.id = t2.id and t1.ver = t2.ver + 1 
 where t1.id = 1;

select t1.id id1, t1.id id2, t1.ver ver1, t2.ver ver2
  from test t1, test t2
 where t1.id = 1
   and t1.id = t2.id (+) and t1.ver - 1 = t2.ver (+)
;
-------------------------------------------------------
When I say "RTFM" or "STFF" or "STFW",
the third letter means "Following" or "Fine"...