powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Про удаление по результатам соединения
11 сообщений из 11, страница 1 из 1
Про удаление по результатам соединения
    #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
Про удаление по результатам соединения
    #39761767
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Но не могу сообразить, как написать такой запрос.

Просто убери TRANS_LINK из подзапроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Про удаление по результатам соединения
    #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
Про удаление по результатам соединения
    #39761777
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.А если мне нужен left join?truncate
...
Рейтинг: 0 / 0
Про удаление по результатам соединения
    #39761790
Фотография 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
Про удаление по результатам соединения
    #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
Про удаление по результатам соединения
    #39761858
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты бы помедитировал над что такое SCD2 прежде чeм удалять. Сам-же пишешь:

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

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

SY.
...
Рейтинг: 0 / 0
Про удаление по результатам соединения
    #39761866
Фотография 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
Про удаление по результатам соединения
    #39761886
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYНу и какая история изменений после удаления?
История (прошлая) сохраняется.
Удаляются запланированные ранее изменения.
...
Рейтинг: 0 / 0
Про удаление по результатам соединения
    #39761964
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Удаляются запланированные ранее изменения.

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

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


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