Здравствуйте, Аноним, Вы писали:
А>надо используя только 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;