powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сравнение записей с учетом данных в подчиненной таблице
5 сообщений из 5, страница 1 из 1
Сравнение записей с учетом данных в подчиненной таблице
    #39378172
ln123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица t1
Код: plsql
1.
 create table t1 (id number, dBegin date, dEnd date) 


к ней есть подчиненная таблица t2
Код: plsql
1.
 create table t2 (id number, idt1 number, nOrder number, fValue number ....)


Отношение таблиц t1 и t2 один ко многим.
Так же есть запрос
Код: plsql
1.
 select  dBegin, dEnd, nOrder, fValue ... from ... 

на основании которого я собираюсь вставлять данные в t1, t2.
Но перед вставкой мне хотелось бы сделать 2 вещи:
1. В запросе объединить периоды с одинаковыми данными в один более большой период т.е. два периода для которых dEnd+1 (первого) = dBegin (второго) и все остальные колонки совпадают для всех строк первого и второго периода
2. Проверить что в таблице t1 не существует периода с такими же данными в таблице t2 как те данные что возвращает мой запрос

Единственный путь который я пока придумал это преобразовать мой запрос к виду
Код: plsql
1.
select dbegin, dEnd, listagg(nOrder||' '||fValue ...) within group (order by nOrder) s from ...


дальше все становится тривиальным, но меня смущает то что результат listagg не может быть больше 4000 символов, а в моем случае это теоретически возможно :(
Может есть какой нибудь другой способ?

P.S. Результирующий код должен работать в 11.2 и 12.1 и хорошо бы (но не обязательно) в postgresql (там как раз с вариантом агрегации в строку все хорошо). Собственно я рассматривал еще следующие варианты агрегации: 1. wm_concate - не работает в 12.1,
2. Агрегация в json - нет в 11.2
3. Агрегация в xml - сравнение xmltype просто так не работает нужно дополнительное преобразование
...
Рейтинг: 0 / 0
Сравнение записей с учетом данных в подчиненной таблице
    #39378192
ln123,

посчитай crc какой-нибудь и сравнивай
...
Рейтинг: 0 / 0
Сравнение записей с учетом данных в подчиненной таблице
    #39378259
ln123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посчитать crcln123,

посчитай crc какой-нибудь и сравнивай

Ключевое слово какой-нибудь :), я не знаю агрегирующих функций для расчета crc к тому же поддерживающих либо order by либо не зависящие от порядка поступления данных на вход, а Вы?

В общем сейчас набросал еще один вариант решения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with period as (select dBegin, dEnd from ...), --Запрос на получение периодов 
MainSelect as (select  dBegin, dEnd, nOrder, fValue ... from ... ), --Собственно основной запрос для формирования записей в таблицах t1, t2
PeriodUnion (dBegin, dEnd) as (select min(t.dBegin ) dBegin, max(p.dEnd) dend  
                               from (select dBegin, dEnd, sum(st) over(order by dBegin) gn 
                                      from (select p.dBegin, p.dEnd, case when lag(p.dEnd) over(order by p.dBegin)+1 = p.dBegin then 0 else 1 end st
                                             from period p where not exists (select nOrder, fValue ...
                                                                      from MainSelect c where c.dBegin = p.dBegin
                                                                      minus
                                                                      select nOrder, fValue ...
                                                                      from MainSelect c where c.dBegin = p.dEnd + 1 )) t) t
                                                                 inner join period p on  p.dBegin = t.dEnd + 1
                                                                 group by gn)
                                                               
select p.dBegin, p.dEnd, c.nOrder, fValue ... from MainSelect c 
inner join PeriodUnion p on  c.dBegin = p.dBegin 
union all                                                                 
select c.dBegin, c.dEnd, c.nOrder, fValue ... from MainSelect c where not exists (select p.dBegin from PeriodUnion p where c.dBegin between p.dBegin and p.dEnd)                                                                 



таким образом, я получу объединение периодов с одинаковыми данными, на а дальше тем же способом отфильтрую те записи которые уже есть в t1, t2
Видимо если кто нибудь не предложит вариант лучше остановлюсь на этом
...
Рейтинг: 0 / 0
Сравнение записей с учетом данных в подчиненной таблице
    #39378473
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ln123,

по старінке (схлопнуть интервалы)
https://groups.google.com/forum/?hl=ru#!topic/fido7.ru.rdbms.oracle/UqO_JFGcb8s

p у Вас набор уникальных полей
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
with po as (
select 1 p,date '2016-01-01' d1,date '2016-01-07' d2 from dual union all
select 1 p,date '2016-01-08' d1,date '2016-01-17' d2 from dual union all
select 1 p,date '2016-01-18' d1,date '2016-01-27' d2 from dual union all
select 1 p,date '2016-01-28' d1,date '2016-01-29' d2 from dual union all
select 1 p,date '2016-01-31' d1,date '2016-02-05' d2 from dual union all
select 1 p,date '2016-02-06' d1,date '2016-04-11' d2 from dual union all
--
select 2 p,date '2017-02-28' d1,date '2017-03-29' d2 from dual union all
select 2 p,date '2017-03-30' d1,date '2017-03-15' d2 from dual union all
select 2 p,date '2017-03-16' d1,date '2017-08-11' d2 from dual union all
--
select 3 p,date '2016-01-31' d1,date '2016-02-05' d2 from dual union all
select 3 p,date '2016-02-06' d1,date '2016-04-11' d2 from dual 
)
select p,min(d1) dStart, max(d2) dEnd from (
select
    p
   ,d1
   ,d2
   ,sum(d2-d1+1) over (partition by p order by d1) dd
from po
)
group by
 p,d2-dd
order by 1,2
/

SQL> /

         P DSTART   DEND
---------- -------- --------
         1 01.01.16 29.01.16
         1 31.01.16 11.04.16
         2 28.02.17 29.03.17
         2 16.03.17 11.08.17
         2 30.03.17 15.03.17
         3 31.01.16 11.04.16

6 rows selected.



......
stax
...
Рейтинг: 0 / 0
Сравнение записей с учетом данных в подчиненной таблице
    #39379229
ln123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..ln123,

по старінке (схлопнуть интервалы)
https://groups.google.com/forum/?hl=ru#!topic/fido7.ru.rdbms.oracle/UqO_JFGcb8s

p у Вас набор уникальных полей
......
stax

Схлопывать интервалы по набору уникальных полей я умею (хотя я это делаю немного иначе чем вы см. мой пост выше), особенность моей ситуации в том что схлопывать нужно по совпадению набора записей в подчиненной таблице. Т.е. набор уникальных полей еще как то получить нужно, в лоб агрегацией строк из подчиненной таблицы в varchar2 не очень хорошо т.к. в 4000 символов помещается только 40 строк, а у меня теоретически может быть больше.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сравнение записей с учетом данных в подчиненной таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]