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

Откуда: Киев
Сообщений: 225
нужна помощь с запросом..
предположим есть какой-то предмет Item который состоит из нескольких частей Parts
см. картинку:
+
Картинка с другого сайта.

красный Item состоит из частей 1, 2 и 3. мне необходимо найти похожие предметы, которые состоят из частей 1, 2 и 3. похожие предметы могут состоять и из других частей, это не критично.
исходя из этого Item 2 не правильный т.к. у него нет части 3, а Item 3 и 4 правильные.

буду благодарен за помощь ;)
18 дек 14, 14:48    [17017367]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
-Евгений-
Member

Откуда: Киев
Сообщений: 225
забыл добавить, структура БД, примерно такая:

create table Items
(
  item_id   number,
  item_name varchar2(256)
);

create table Parts
(
  item_id   number,
  part_name varchar2(256)
);


зы. знаю что корявая.. не я делал...
18 дек 14, 14:54    [17017434]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
Elic
Member

Откуда:
Сообщений: 29980
Hint: Если части кандидата реляционно вычесть из частей эталона, то должна остаться пустота.
18 дек 14, 15:00    [17017494]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
stax..
Guest
-Евгений-,

with Parts (item_id,par_name) as (
select 1 ,1 from dual union all
select 1 ,2 from dual union all
select 1 ,3 from dual union all
select 2 ,1 from dual union all
select 2 ,2 from dual union all
select 2 ,4 from dual union all
select 3 ,1 from dual union all
select 3 ,2 from dual union all
select 3 ,3 from dual union all
select 3 ,5 from dual union all
select 4 ,1 from dual union all
select 4 ,2 from dual union all
select 4 ,3 from dual )
,etalon as (select * from Parts where item_id=1)
select 
 p.item_id
from 
 parts p ,etalon e 
where p.par_name=e.par_name and p.item_id<>e.item_id
group by p.item_id
having count(distinct p.par_name)=(select count(distinct par_name) from etalon)
order by 1
/
   ITEM_ID
----------
         3
         4


.......
stax
18 дек 14, 16:16    [17018040]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
-Евгений-
Member

Откуда: Киев
Сообщений: 225
stax..,

блин.. идеально !!! спасибо ;)
сейчас попробую, насколько быстро оно будет на реальных данных работать :)
18 дек 14, 16:33    [17018156]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
Изя Кацман
Member

Откуда: Великий Эксперимент
Сообщений: 2019
-Евгений-
идеально !!!
Ничто на белом свете не идеально, камрад :)

И ето хорошо! :)
18 дек 14, 16:37    [17018185]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
-Евгений-
блин.. идеально !!!

мда?)
+ нуну...
with Parts (item_id,par_name) as (
select 1 ,1 from dual union all
select 1 ,2 from dual union all
select 1 ,3 from dual union all
select 2 ,1 from dual union all
select 2 ,2 from dual union all
select 2 ,4 from dual union all
select 3 ,1 from dual union all
select 3 ,2 from dual union all
select 3 ,3 from dual union all
select 3 ,5 from dual union all
select 4 ,1 from dual union all
select 4 ,2 from dual union all
select 4 ,4 from dual union all
select 4 ,3 from dual )
,etalon as (select * from Parts where item_id=1)
select 
 p.item_id
from 
 parts p ,etalon e 
where p.par_name=e.par_name and p.item_id<>e.item_id
group by p.item_id
having count(distinct p.par_name)=(select count(distinct par_name) from etalon)
order by 1
18 дек 14, 16:39    [17018203]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
-Евгений-
Member

Откуда: Киев
Сообщений: 225
Изя Кацман, Vint,

мужики, а что не так ? у меня работает. причем на таблице в чуть более 43к, запрос отрабатывает менее 0,05 сек.
что вам смущает ?

зы. stax, еще раз спасибо вам ;)
18 дек 14, 16:43    [17018240]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
-Евгений-
похожие предметы могут состоять и из других частей, это не критично.

не увидел. так то да.
18 дек 14, 16:46    [17018259]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
stax..
Guest
-Евгений-
stax..,
сейчас попробую, насколько быстро оно будет на реальных данных работать :)

можно еще сделать через submultiset, но мне кажется что с "массивами" будет подольше

......
stax
18 дек 14, 17:11    [17018444]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
Изя Кацман
Member

Откуда: Великий Эксперимент
Сообщений: 2019
-Евгений-
у меня работает. причем на таблице в чуть более 43к, запрос отрабатывает менее 0,05 сек.
Когда таблица твоя подрастет "в чуть более 43b", приходи, камрад, будем оптимайзить :)
19 дек 14, 12:34    [17022308]     Ответить | Цитировать Сообщить модератору
 Re: хитрый запрос  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 1861
Изя Кацман
-Евгений-
у меня работает. причем на таблице в чуть более 43к, запрос отрабатывает менее 0,05 сек.
Когда таблица твоя подрастет "в чуть более 43b", приходи, камрад, будем оптимайзить :)


а что там криминального? разве что вангую sort group by вместо hash group by.
22 дек 14, 18:20    [17036154]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить