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

Задача такая.
Есть две таблицы. В них есть дубликаты.
Требуется: получить "разность" таблиц (т. е. те "куски", к-рые присутствуют в одной таблице, но отсутствуют в другой).
При этом необходимо избежать удаления лишних дубликатов.


Например, есть у нас две одностолбцовые таблицы:


create table T1 (pole NUMBER);

insert into T1 values(5);
insert into T1 values(5);
insert into T1 values(5);
insert into T1 values(5);
insert into T1 values(6);
insert into T1 values(7);
insert into T1 values(8);

create table T2 (pole NUMBER);

insert into T2 values(5);
insert into T2 values(5);
insert into T2 values(6);
insert into T2 values(7);


Нужно получить таблицу T3.

select *
from T3;

5
5
8


Если решать эту задачу с использование MINUS и предиката in, то подавляются дубликаты.

Одно решение на PL/SQL у меня есть, но оно, по-видимому, обладает неудовлетворительной производительностью.
Интересуют различные варианты, если кто сталкивался.

Спасибо.
23 авг 06, 13:12    [3042799]     Ответить | Цитировать Сообщить модератору
 Re: Разность таблиц без удаления дублей  [new]
iV@n
Member

Откуда:
Сообщений: 382
select pole from(
select pole, row_number() over (partition by pole order by 1) rn from t1
minus
select pole, row_number() over (partition by pole order by 1) rn from t2)
23 авг 06, 13:17    [3042830]     Ответить | Цитировать Сообщить модератору
 Re: Разность таблиц без удаления дублей  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
iV@n
select pole from(
select pole, row_number() over (partition by pole order by 1) rn from t1
minus
select pole, row_number() over (partition by pole order by 1) rn from t2)


Если я правильно понял, то почти

автор
Требуется: получить "разность" таблиц (т. е. те "куски", к-рые присутствуют в одной таблице, но отсутствуют в другой).


select pole
from
(
( select row_number() over(partition by pole order by rowid) rn, t1.pole from scott.t1
  MINUS
  select row_number() over (partition by pole order by rowid) rn, t2.pole from scott.t2)
  union all
  (select row_number() over(partition by pole order by rowid) rn, t2.pole from scott.t2
  MINUS
  select row_number() over (partition by pole order by rowid) rn, t1.pole from scott.t1)
 )
23 авг 06, 13:30    [3042904]     Ответить | Цитировать Сообщить модератору
 Re: Разность таблиц без удаления дублей  [new]
Бухой пингвин
Guest
Огромное спасибо.


Вариант

select pole from(
select pole, row_number() over (partition by pole order by 1) rn from t1
minus
select pole, row_number() over (partition by pole order by 1) rn from t2)


работает как мне надо.


Если можно, напишите как его экстраполировать на случай произвольного количества полей.
23 авг 06, 13:48    [3043034]     Ответить | Цитировать Сообщить модератору
 Re: Разность таблиц без удаления дублей  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
Бухой пингвин

Если можно, напишите как его экстраполировать на случай произвольного количества полей.

Перечисляете эти "произвольные" поля в селектах и в partition by...
23 авг 06, 13:51    [3043055]     Ответить | Цитировать Сообщить модератору
 Re: Разность таблиц без удаления дублей  [new]
Бухой пингвин
Guest
Господа,

спасибо вам огромное.
Вы мне очень помогли.
Спасибо.
23 авг 06, 14:22    [3043304]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить