Re: Oracle 8.1.6 помогите с запросом
От: mcureenab  
Дата: 08.09.05 10:46
Оценка: 16 (2)
Здравствуйте, Аноним, Вы писали:

А>надо используя только T

А>получить t.ID,N
А>Где N имеет одно значение для одинаковых T.NAME <> NULL
А>и если T.NAME = null, то N должно быть уникально и <> N для которых Т.NAME <> NULL

Вот что удалось придумать.

create table T(
id number primary key,
Name varchar2(32)
);

insert into t values(1,'abc');
insert into t values(2,'abc');
insert into t values(3,'abcd');
insert into t values(4,'abcd');
insert into t values(5, null);
insert into t values(6, null);
commit;

select t.id, nc.n
from
t,
(
select rownum n, name, id
from
(select distinct name, decode(name, null, id) id from t)
) nc
where
t.name = nc.name or t.id = nc.id;

ID N
--- -----
5 3
6 4
1 1
2 1
3 2
4 2

6 rows selected.

1. Все непустые name имеют уникальные номера.
2. Каждая строка с пустым name имеет уникальное значение в поле n.
3. Остальные строки имеют в поле n номер соответсвующий значению name определённый в п. 1.

Задача красиво решается в Oracle9i.

select
id,
dense_rank() over (order by name, nvl2(name, null, id) nulls last) n
from t;

Результат:
ID N
--- -----
1 1
2 1
3 2
4 2
5 3
6 4

6 rows selected.

drop table T;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.