Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите новичку написать запрос....  [new]
ZSergey
Member

Откуда: г.Костанай, Казахстан
Сообщений: 98
Привет знатоки!
Имееться вде таблицы:

create table aa (id number, scolor varchar2(100));
create table bb (id number, sname varchar2(100), prioritet number);

insert into aa(id, scolor) values (1, 'Цвета1');
insert into aa(id, scolor) values (2, 'Цвета2');
insert into bb(id, sname, prioritet) values (1, 'Белый', null);
insert into bb(id, sname, prioritet) values (1, 'Черный', null);
insert into bb(id, sname, prioritet) values (2, 'Желтый', 1);
insert into bb(id, sname, prioritet) values (2, 'Синий', null);
commit;

select aa.scolor, bb.sname, bb.prioritet
from aa, bb
where aa.id = bb.id 
and (bb.prioritet = 1 or bb.prioritet is null)


  	SNAME	SNAME	PRIORITET
1 Цвета1 Белый
2 Цвета1 Черный
3 Цвета2 Желтый 1
4 Цвета2 Синий

Желаемый результат:
1	Цвета1	Белый	
2 Цвета1 Черный
3 Цвета2 Желтый 1

т.е. выбирать нужно так: если у всех цветов нет приоритета (null), то выбираем все, если у какого-то цвета есть приоритет (1), берем только его. Как написать селект?
3 апр 06, 14:46    [2518108]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку написать запрос....  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
select * 
  from (
          select aa.scolor, 
                 bb.sname, 
                 bb.prioritet,
                 case when sum(prioritet) over(partition by SCOLOR) >= 1 
                         then case when prioritet is not null 
                                      then 1 
                                   else 0 
                              end
                      else 1 
                 end as flag
            from aa, bb
           where aa.id = bb.id 
             and (bb.prioritet = 1 or bb.prioritet is null)
       ) 
 where flag = 1

Query finished, retrieving results...

SCOLOR  SNAME   PRIORITET  FLAG
------  ------  ---------  ----
Цвета1  Белый                 1
Цвета1  Черный                1
Цвета2  Желтый           1    1

3 row(s) retrieved
3 апр 06, 14:54    [2518157]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку написать запрос....  [new]
ZSergey
Member

Откуда: г.Костанай, Казахстан
Сообщений: 98
Спасибо! Блин с аналитикой дела обстоят туго, точнее сказать - никак. Буду учить.
3 апр 06, 14:57    [2518176]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку написать запрос....  [new]
Амаразм
Member

Откуда:
Сообщений: 299
Тоже самое, только без аналитики и несколько хуже по количеству чтений:

SELECT AA.ID, BB.SNAME, AA.SCOLOR
FROM AA,
BB,
(SELECT ID
FROM AA
MINUS
SELECT ID
FROM BB
WHERE BB.PRIORITET = 1) CC
WHERE AA.ID = BB.ID
AND (AA.ID = CC.ID OR BB.PRIORITET = 1)
3 апр 06, 15:58    [2518597]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку написать запрос....  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116202
Я тоже попробовал, но с аналитикой.

Тестовые данные

insert into scott.aa(id, scolor) values (1, 'Colors1');
insert into scott.aa(id, scolor) values (2, 'Colors2');
insert into scott.bb(id, sname, prioritet) values (1, 'White', null);
insert into scott.bb(id, sname, prioritet) values (1, 'Blue', null);
insert into scott.bb(id, sname, prioritet) values (2, 'Yellow', 1);
insert into scott.bb(id, sname, prioritet) values (2, 'Red', null);

select id, scolor, sname, prioritet from
(
select aa.id, sname, scolor, prioritet, 
           lag(prioritet) over (partition by aa.id order by prioritet) prio_lag,
           lag(aa.id,1,aa.id) over (partition by aa.id order by aa.id) id_lag
from scott.aa, scott.bb
where aa.id = bb.id           
order by aa.id, prioritet 
)
where prioritet is not null 
or (prio_lag is null and id = id_lag) 
order by id

Результат


ID scolor sname prioritet
1 Colors1 White
1 Colors1 Blue
2 Colors2 Yellow 1
3 апр 06, 16:20    [2518755]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку написать запрос....  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116202
dmidek


select id, scolor, sname, prioritet from
(
select aa.id, sname, scolor, prioritet, 
           lag(prioritet) over (partition by aa.id order by prioritet) prio_lag,
           lag(aa.id,1,aa.id) over (partition by aa.id order by aa.id) id_lag
from scott.aa, scott.bb
where aa.id = bb.id           
order by aa.id, prioritet 
)
where prioritet is not null 
or (prio_lag is null and id = id_lag) 
order by id



По дороге домой, понял, что чушь собачья.
И надо было всего лишь добавить для проверки

insert into bb(id, sname, prioritet) values (2, 'Green', null);

Страшно зол.
Бред ф топку :-(((
3 апр 06, 20:56    [2519687]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить