Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Про удаление по результатам соединения / 11 сообщений из 11, страница 1 из 1
18.01.2019, 22:47
    #39761766
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Возник типовой вопрос — как удалить данные из запроса с join?
Я погуглил как в интернете, так и по форуму .
Рабочий пример у меня есть:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
delete from TRANS_LINK
where TRANS_LINK_ID in
(
select tl.TRANS_LINK_ID
from TRANS_LINK tl
join TRANS_BATCH_LINK rs on (tl.TRANS_PROVIDER_ID = rs.TRANS_PROVIDER_ID and tl.LOCAL_CLIENT_ID = rs.LOCAL_CLIENT_ID)
where tl.DATE_BEG > rs.DATE_BEG
)


Но у меня сложилось впечатление, что IN лучше бы избегать, везде стараются переписать запрос, чтобы использовать EXISTS.
Но не могу сообразить, как написать такой запрос.

Запрос в формате DELETE (subquery) может и был бы эффективнее, но тут какая-то непонятная мне магия действует.
Я не могу понять, какая таблица считается key preserved. В TRANS_LINK есть PK и вроде бы это должна быть она. Но когда я пытаюсь выполнить DELETE, то получаю ошибку ORA-01752.
...
Рейтинг: 0 / 0
18.01.2019, 23:08
    #39761767
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Alibek B.Но не могу сообразить, как написать такой запрос.

Просто убери TRANS_LINK из подзапроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.01.2019, 23:22
    #39761774
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
delete from TRANS_LINK tl
where exists
(
select tl.TRANS_LINK_ID
from TRANS_BATCH_LINK rs
where tl.DATE_BEG > rs.DATE_BEG
and tl.TRANS_PROVIDER_ID = rs.TRANS_PROVIDER_ID
and tl.LOCAL_CLIENT_ID = rs.LOCAL_CLIENT_ID
)


Синтаксис вроде бы принимается.
А если мне нужен left join?
...
Рейтинг: 0 / 0
18.01.2019, 23:30
    #39761777
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Alibek B.А если мне нужен left join?truncate
...
Рейтинг: 0 / 0
19.01.2019, 00:54
    #39761790
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Dimitry Sibiryakov
Просто убери TRANS_LINK из подзапроса.


И получишь совершенно другой DELETE:

Код: 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.
SQL> delete emp1
  2   where job in (
  3                 select  job
  4                   from  emp1
  5                   where

SQL> delete emp1
  2   where job in (
  3                 select  job
  4                   from  emp1,
  5                         dept
  6                   where emp1.deptno = dept.deptno
  7                     and dept.loc = 'DALLAS'
  8                )
  9  /

9 rows deleted.

SQL> rollback;

Rollback complete.

SQL> delete emp1
  2  where job in (
  3                select  job
  4                  from  dept
  5                  where emp1.deptno = dept.deptno
  6                    and dept.loc = 'DALLAS'
  7               )
  8  /

5 rows deleted.

SQL> 



Посему вначале Алибек должен озвучить логику удаления.

SY.
...
Рейтинг: 0 / 0
19.01.2019, 12:44
    #39761838
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Словами логика следующая.
В TRANS_LINK находятся данные с историей изменений (SCD2).
В TRANS_BATCH_LINK структура идентичная, там находятся добавляемые данные.
Мне нужно удалить из TRANS_LINK все записи, которые действуют после даты действия соответствующих записей в TRANS_BATCH_LINK (то есть у которых TRANS_LINK.DATE_BEG > TRANS_BATCH_LINK.DATE_BEG). Соответствие записей однозначно определяется комбинацией полей TRANS_PROVIDER_ID и LOCAL_CLIENT_ID.
Потом я в TRANS_LINK обновляю период окончания действия у текущих (действующих) записей и добавляю новые записи.
То есть последовательно выполняю два запроса:
Код: 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.
delete from TRANS_LINK where TRANS_LINK_ID in
(
  select tl.TRANS_LINK_ID
  from TRANS_LINK tl
  join TRANS_BATCH_LINK rs on (tl.TRANS_PROVIDER_ID = rs.TRANS_PROVIDER_ID and tl.LOCAL_CLIENT_ID = rs.LOCAL_CLIENT_ID)
  where tl.DATE_BEG > rs.DATE_BEG
)
;

merge into TRANS_LINK data
using
(
  select tl.*
  , rs.TRANS_PROVIDER_ID as NEW_PROVIDER
  , rs.LOCAL_CLIENT_ID as NEW_CLIENT
  , rs.LOCAL_ACCOUNT_ID as NEW_ACCOUNT
  , rs.LOCAL_SERVICE_ID as NEW_SERVICE
  , rs.FIELD as NEW_FIELD
  , rs.VALUE as NEW_VALUE
  , rs.DESCRIPTION as NEW_DESCRIPTION
  , rs.DATE_BEG as NEW_MOMENT
  , D.FLAG
  from TRANS_BATCH_LINK rs
  left join TRANS_LINK tl on (tl.TRANS_PROVIDER_ID = rs.TRANS_PROVIDER_ID and tl.LOCAL_CLIENT_ID = rs.LOCAL_CLIENT_ID and tl.DATE_BEG <= rs.DATE_BEG and (tl.DATE_END is null or tl.DATE_END > rs.DATE_BEG))
  left join (select null as FLAG from dual union all select 1 from dual) D on (tl.TRANS_LINK_ID is not null)
) rs on (rs.TRANS_LINK_ID = data.TRANS_LINK_ID and rs.FLAG is not null)
when matched then
  update set data.DATE_END = rs.NEW_MOMENT
when not matched then
  insert (data.TRANS_PROVIDER_ID, data.LOCAL_CLIENT_ID, data.LOCAL_ACCOUNT_ID, data.LOCAL_SERVICE_ID, data.FIELD,     data.VALUE,     data.DESCRIPTION,     data.DATE_BEG,   data.DATE_END)
  values (  rs.NEW_PROVIDER,        rs.NEW_CLIENT,        rs.NEW_ACCOUNT,        rs.NEW_SERVICE,        rs.NEW_FIELD,   rs.NEW_VALUE,   rs.NEW_DESCRIPTION,   rs.NEW_MOMENT, null)
;


Вот первый запрос мне бы хотелось оптимизировать.
Как мне кажется, использование EXISTS предпочтительнее IN.
...
Рейтинг: 0 / 0
19.01.2019, 15:16
    #39761858
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Ты бы помедитировал над что такое SCD2 прежде чeм удалять. Сам-же пишешь:

В TRANS_LINK находятся данные с историей изменений (SCD2).

Ну и какая история изменений после удаления?

SY.
...
Рейтинг: 0 / 0
19.01.2019, 15:46
    #39761866
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Похоже у тебя by-temporal validity, т.е. у тебя effective dates и valid dates. Например: оптовая база. 15 Января пришло ц.у. с 1 Февраля девяток яиц стоит 65 рублей. Имеем:

Код: plsql
1.
2.
3.
PRODUCT     PRICE EFFECTIVE_FROM    EFFECTIVE_TO    VALID_FROM         VALID_TO
----------- ----- -------------- --------------- -------------- ---------------
девяток яиц    65 1 Февраля 2019 31 Декaбря 9999 15 Января 2019 31 Декaбря 9999



A сегoдня пришло ц.у. с 25 Января девяток яиц стоит 66 рублей. Имеем:

Код: plsql
1.
2.
3.
4.
PRODUCT     PRICE EFFECTIVE_FROM    EFFECTIVE_TO     VALID_FROM        VALID_TO
----------- ----- -------------- --------------- -------------- ---------------
девяток яиц    65 1 Февраля 2019 31 Декaбря 9999 15 Января 2019 18 Января 2019
девяток яиц    66 25 Января 2019 31 Декaбря 9999 19 Января 2019 31 Декaбря 9999



Т.e. начиная с 15 Января 2019 при составлении контракта на поставку скажем 1 Марта 2019 яйца продаем по 65. A начиная с 19 Января 2019 при составлении контракта на поставку того же 1 Марта 2019 яйца продаем по 66. Если 19 Января удалить первую запись то первый же аудит надает CFO по голове ибо как ты обьяснишь 65р в первом контракте.

SY.
...
Рейтинг: 0 / 0
19.01.2019, 19:07
    #39761886
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
SYНу и какая история изменений после удаления?
История (прошлая) сохраняется.
Удаляются запланированные ранее изменения.
...
Рейтинг: 0 / 0
20.01.2019, 01:50
    #39761964
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Alibek B.Удаляются запланированные ранее изменения.

В SCD2 ничeго не удаляется. В SCD2 что написано перoм то не вырубишь топором . Xранятся ВСЕ записи и даты их действия для того чтобы можно было бы возпроизвести систeму как она была на любой момент времени. То что ты пытаешься сделать может тебе и подходит но это не SCD2.

SY.
...
Рейтинг: 0 / 0
20.01.2019, 08:58
    #39761980
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про удаление по результатам соединения
Ясно, в таком случае у меня не SCD2, а что-то похожее.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Про удаление по результатам соединения / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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