powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Delete и Left Join
15 сообщений из 15, страница 1 из 1
Delete и Left Join
    #39179452
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задача: надо выбрать устаревшие записи из одной таблицы, и удалить записи с такими же ключами из другой.

вот так - работает, но медленно:
Код: sql
1.
2.
3.
4.
5.
delete from table1 t1
where t1.key in

(select t2.key from Table2 t2
where t2_created<DATEADD(:P minute TO CURRENT_timestamp))



посмотрел, удаление по left join может делать, например, MySQL, а вот FB на такое ругается

что тут еще можно сделать?
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179458
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok,

и обязательно одним оператором?
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179483
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok,

EXIST?
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179604
someonesomeone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на ум приходит такой вариант:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
execute block(p integer=:p)
as
declare variable dt_ timestamp;
declare variable key_ integer;
begin
  dt_=dateadd(:p minute to current_timestamp);
  for select t1.key from table1 t1 where exists(select * from table2 where key=t1.key and created<:dt_)
  into key_ as cursor tmp do
    delete from table1 t1 where current of tmp;
end
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179614
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://ibase.ru/devinfo/deldupes.htm
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179618
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
someonesomeoneна ум приходит такой вариант:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
execute block(p integer=:p)
as
declare variable dt_ timestamp;
declare variable key_ integer;
begin
  dt_=dateadd(:p minute to current_timestamp);
  for select t1.key from table1 t1 where exists(select * from table2 where key=t1.key and created<:dt_)
  into key_ as cursor tmp do
    delete from table1 t1 where current of tmp;
end



Так не проще? Зачем лишняя проверка?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
execute block(p integer=:p)
as
declare variable dt_ timestamp;
declare variable key_ integer;
begin
  dt_=dateadd(:p minute to current_timestamp);
  for select t2.key from table2 t2 where  t2.created<:dt_)
  into :key_  do
    delete from table1 t1 where t1.key = :key_;
end
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179667
someonesomeone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Граур Станислав,
для скорости, конечно
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179821
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mgenok,

и обязательно одним оператором?

не обязательно, конечно. Про процедуру тоже сразу подумал, но написал сюда, потому как вдруг кто предложит однооператорное решение
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179843
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граур Станислав
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
execute block(p integer=:p)
as
declare variable dt_ timestamp;
declare variable key_ integer;
begin
  dt_=dateadd(:p minute to current_timestamp);
  for select t2.key from table2 t2 where  t2.created<:dt_)
  into :key_  do
    delete from table1 t1 where t1.key = :key_;
end



шустро работает, спасибо!
...
Рейтинг: 0 / 0
Delete и Left Join
    #39179860
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokm7mgenok,
и обязательно одним оператором?

не обязательно, конечно. Про процедуру тоже сразу подумал, но написал сюда, потому как вдруг кто предложит однооператорное решение

В Firebird 3.0 можно с помощью MERGE.
...
Рейтинг: 0 / 0
Delete и Left Join
    #39180382
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
В Firebird 3.0 можно с помощью MERGE.

merge ведь есть и в 2.5 и ранее
или в 3.0 он функционально расширился?

сможешь написать запрос, как ты видишь тут использование Merge?
...
Рейтинг: 0 / 0
Delete и Left Join
    #39180396
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokСимонов ДенисВ Firebird 3.0 можно с помощью MERGE.

merge ведь есть и в 2.5 и ранее
или в 3.0 он функционально расширился?


merge
...
Рейтинг: 0 / 0
Delete и Left Join
    #39180534
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mmerge
к чему эти старые ссылки, когда в шапке раздела есть дока в pdf на русском языке и по 2.5 и по 3.0?
в частности, есть документ, где собраны только новые фичи sql 3.0
https://www.assembla.com/spaces/firebird-russian-documentation/documents/cvsAgIB18r5l4sacwqEsg8/download/cvsAgIB18r5l4sacwqEsg8
про изменения merge там на 15-й странице.
...
Рейтинг: 0 / 0
Delete и Left Join
    #39180536
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokили в 3.0 он функционально расширился?

расширился и довольно значительно. Теперь MERGE то универсальный комбайн по всем видам модификации данных в таблице. Ссылки уже дали.
...
Рейтинг: 0 / 0
Delete и Left Join
    #39180612
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvm7mmerge
к чему эти старые ссылки, когда в шапке раздела есть дока в pdf на русском языке и по 2.5 и по 3.0?

что гугл показал туда я и отправил
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Delete и Left Join
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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