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

Откуда: Москва
Сообщений: 96
Уважаемый All!

столкнулся с задачей написания select, с условием совпадения двух списков
(т.е. есть две таблицы связанные как мастер-деталь, надо найти записи из мастер таблицы, у которых списки детальных записей совпадают по некоему признаку
что-то типа ...
where (select id from tab1=where other_id=111)= (select id from tab1 where other_id=222)

В какую сторону посмотреть?

спасибо
20 мар 06, 14:36    [2467426]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
Олег70
Уважаемый All!

столкнулся с задачей написания select, с условием совпадения двух списков
(т.е. есть две таблицы связанные как мастер-деталь, надо найти записи из мастер таблицы, у которых списки детальных записей совпадают по некоему признаку
что-то типа ...
where (select id from tab1=where other_id=111)= (select id from tab1 where other_id=222)

В какую сторону посмотреть?

спасибо

self join

Что то типа :-)
where exists
(select null from tab1 t1, tab1 t2 where t1.other_id=222 and t2.other_id=111
and t1.id = t2.id and t1.id = master.id)
20 мар 06, 14:41    [2467463]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Elic
Member

Откуда:
Сообщений: 29977
dmidek
Олег70
столкнулся с задачей написания select, с условием совпадения двух списков
where exists
(select null from tab1 t1, tab1 t2 where t1.other_id=222 and t2.other_id=111
and t1.id = t2.id and t1.id = master.id)
Это ответит всего лишь на вопрос, есть ли хотя бы один одинаковый элемент в списках
20 мар 06, 14:50    [2467516]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
Elic
dmidek
Олег70
столкнулся с задачей написания select, с условием совпадения двух списков
where exists
(select null from tab1 t1, tab1 t2 where t1.other_id=222 and t2.other_id=111
and t1.id = t2.id and t1.id = master.id)
Это ответит всего лишь на вопрос, есть ли хотя бы один одинаковый элемент в списках

dmidek
and t1.id = master.id
20 мар 06, 14:52    [2467528]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Elic
Member

Откуда:
Сообщений: 29977
dmidek
Elic
Это ответит всего лишь на вопрос, есть ли хотя бы один одинаковый элемент в списках
dmidek
and t1.id = master.id
Даже если это и является(?) условием мастер-деталь, "Сравнением списков" тут не пахнет.
Возможно автор недостаточно хорошо сформулировал свою задачу :)
20 мар 06, 15:10    [2467647]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
тупо, в лоб. Аналитические (более :) функции тут к месту будут
create table aa1(a1 number,a2 number,a3 number);
create table aa2(a1 number,a2 number,a3 number);
create table aa3(a1 number,a2 number,b3 number);

select min(item_equal) list_equal from
(select decode(min(tname),max(tname),0,1) item_equal from
(select b.* from
       tab a
      ,col b
  where a.tname = 'AA1'
    and a.tname = b.tname
union all select b.*
from tab a
    ,col b
where a.tname = 'AA2'
  and a.tname = b.tname
) group by cname);
20 мар 06, 15:14    [2467675]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Олег70
Member

Откуда: Москва
Сообщений: 96
create table a (a_id number);
create table b (a_id number, c_id number)
create table c ( c_id number)

имеем связь многие ко многим таблиц a И c через таблицу b
зная явный a_id=111 мне надо в таблице A найти все записи, которые ссылаются на такой же набор значений в таблице с, что и запись с a_id=111

Возможно я действительно плохо сформулировал задачу, потому мне и поиск не помог :)
20 мар 06, 15:19    [2467717]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
Elic
dmidek
Elic
Это ответит всего лишь на вопрос, есть ли хотя бы один одинаковый элемент в списках
dmidek
and t1.id = master.id
Даже если это и является(?) условием мастер-деталь, "Сравнением списков" тут не пахнет.
Возможно автор недостаточно хорошо сформулировал свою задачу :)

Да, Elic, возможно.
Я ориентировался на эту фразу
Олег70
(т.е. есть две таблицы связанные как мастер-деталь, надо найти записи из мастер таблицы, у которых списки детальных записей совпадают по некоему признаку
20 мар 06, 15:20    [2467724]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
Олег70
create table a (a_id number);
create table b (a_id number, c_id number)
create table c ( c_id number)

имеем связь многие ко многим таблиц a И c через таблицу b
зная явный a_id=111 мне надо в таблице A найти все записи, которые ссылаются на такой же набор значений в таблице с, что и запись с a_id=111

Возможно я действительно плохо сформулировал задачу, потому мне и поиск не помог :)

Черт побери, вот теперь я действительно ничего не понял.
Может на примерчике покажете
20 мар 06, 15:23    [2467742]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Олег70
create table a (a_id number);
create table b (a_id number, c_id number)
create table c ( c_id number)

имеем связь многие ко многим таблиц a И c через таблицу b
зная явный a_id=111 мне надо в таблице A найти все записи, которые ссылаются на такой же набор значений в таблице с, что и запись с a_id=111

Возможно я действительно плохо сформулировал задачу, потому мне и поиск не помог :)

table a ==> tab - в моем примере
table b ==> col
20 мар 06, 15:26    [2467772]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Олег70
Member

Откуда: Москва
Сообщений: 96
to dmidek

охотно :)
Давайте представим себе, что таблица a - это перечень юзеров (ну UID например)

inSert into a values (1);
inSert into a values (2);
inSert into a values (3);

таблица C - перечень компов

inSert into с values (100);
inSert into с values (200);
inSert into с values (300);

таблица B - кросс между ними

insert into b (a_id, c_id) values (1,100);
insert into b (a_id, c_id) values (1,200);

insert into b (a_id, c_id) values (2,100);
insert into b (a_id, c_id) values (2,300);

insert into b (a_id, c_id) values (3,100);
insert into b (a_id, c_id) values (3,200);

т. е. пользователь 1, 3 Может работать на компах 100 и 200
пользователь 2 на компах 100 и 300

мне задан id пользователя =1

мне надо найти всех пользователей, которые могут работать в точности на тех же компах , что и пользователь 1 ( в нашем примере ответом должен быть пользователь 3).

Пример подходящий?
20 мар 06, 15:31    [2467796]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
with s1 as
    (select 1 n, 1 parent_id from dual
     union all
     select 2 n, 1 parent_id from dual
     union all
     select 3 n, 1 parent_id from dual
     union all
     select 1 n, 2 parent_id from dual
     union all
     select 2 n, 2 parent_id from dual
     union all
     select 2 n, 3 parent_id from dual
     union all
     select 3 n, 2 parent_id from dual),
     s2 as
     (select 1 parent_id from dual union all select 2 parent_id from dual union all select 3 parent_id from dual)
select * from s2
where s2.parent_id <> 1
and (select count(*) from s1 where parent_id = s2.parent_id) =
    (select count(*) from (select n from s1 where parent_id = s2.parent_id
       union select n from s1 where parent_id = 1))

Вот только почему-то на 9ке (9.2.0.5.0) не разрешает так писать (904 я на поле s2.parent_id). На 10ке запросто. Никто не объяснит почему?? ;(
20 мар 06, 15:37    [2467836]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Elic
Member

Откуда:
Сообщений: 29977
Олег70
create table a (a_id number);
create table b (a_id number, c_id number)
create table c ( c_id number)
Если unique b(a_id,c_id), то например:
var id number
exec :id := 1

select b2.a_id
  from b b1, b b2
  where b1.a_id = :id
    and b2.c_id = b1.c_id
  group by b2.a_id
  having count(*) = (select count(*) from b b3 where b3.a_id = :id)
;

         A_ID
-------------
            1
            3

2 rows selected.
20 мар 06, 15:44    [2467869]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Elic
Member

Откуда:
Сообщений: 29977
Jannny
    (select count(*) from (select n from s1 where parent_id = s2.parent_id
Вот только почему-то на 9ке (9.2.0.5.0) не разрешает так писать (904 я на поле s2.parent_id). На 10ке запросто. Никто не объяснит почему?? ;(
inline view не может быть коррелированным
А на 10-ке, говоришь, этого ограничения уже нет? Будем знать :)
20 мар 06, 15:52    [2467922]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Олег70
Member

Откуда: Москва
Сообщений: 96
to Elic

Добавляем еще одну запись для пользователя 3. Списки в таблице b для пользователей 1 и 2 НЕ ИДЕНТИЧНЫ


SQL> insert into b (a_id, c_id) values (3,400);

1 row created.

SQL> select b2.a_id
2 from b b1, b b2
3 where b1.a_id = 1
4 and b2.c_id = b1.c_id
5 group by b2.a_id
6 having count(*) = (select count(*) from b b3 where b3.a_id = 1);

A_ID
----------
1
3

SQL>
20 мар 06, 16:01    [2467983]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Олег70
Member

Откуда: Москва
Сообщений: 96
сорри ... пользователей 1 и 3
20 мар 06, 16:02    [2467991]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Elic
Member

Откуда:
Сообщений: 29977
Олег70
to Elic
Добавляем еще одну запись для пользователя 3
Нет в мире предела совершенству :)
select b2.a_id
  from b b1, b b2
  where b1.a_id(+) = :id
    and b2.c_id = b1.c_id(+)
  group by b2.a_id
  having count(*) = (select count(*) from b b3 where b3.a_id = :id)
    and  count(*) = count(b1.c_id)
;
20 мар 06, 16:12    [2468072]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Олег70
Member

Откуда: Москва
Сообщений: 96
to Elic
Спасибо. До меня никак не доходило первый outer join поставить :)
20 мар 06, 16:18    [2468118]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
inline view не может быть коррелированным
А на 10-ке, говоришь, этого ограничения уже нет? Будем знать :)

Сенкс. Да, теперь можно смело писать : inline view не могло быть коррелированным ;))
20 мар 06, 17:41    [2468599]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
var id number
exec :id := 1

select a0, min(item_eq)  list_eq
from (select a0, decode(min(a_id),max(a_id),0,1)  item_eq
  from (select a0, c_id, a_id
        from b
            ,(select distinct a_id as a0
                from b
               where a_id <> :id )
       where b.a_id = a0
          or b.a_id = :id )
     group by a0 ,c_id
) group by a0;

   A0    LIST_EQ
------ ----------
    2          0
    3          1
20 мар 06, 18:03    [2468767]     Ответить | Цитировать Сообщить модератору
 Re: вопрос. Сравнение списков  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
Кажется, еще не было
SELECT a_id
FROM
  (SELECT  a.a_id, b.c_id, Count (b.a_id) cnt
   FROM    a,b
   WHERE   b.a_id IN (1,a.a_id) AND a.a_id <>1 
   GROUP BY a.a_id, b.c_id
  )   
GROUP BY a_id
HAVING Min(cnt)=2;     
20 мар 06, 20:18    [2469251]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить