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

вот так - работает, но медленно:
Код: 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
26.02.2016, 06:21
    #39179458
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
genok,

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

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

Код: 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
26.02.2016, 11:35
    #39179614
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
http://ibase.ru/devinfo/deldupes.htm
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.02.2016, 11:39
    #39179618
Граур Станислав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
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
26.02.2016, 12:08
    #39179667
someonesomeone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
Граур Станислав,
для скорости, конечно
...
Рейтинг: 0 / 0
26.02.2016, 13:59
    #39179821
genok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
m7mgenok,

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

не обязательно, конечно. Про процедуру тоже сразу подумал, но написал сюда, потому как вдруг кто предложит однооператорное решение
...
Рейтинг: 0 / 0
26.02.2016, 14:14
    #39179843
genok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
Граур Станислав
Код: 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
26.02.2016, 14:29
    #39179860
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
genokm7mgenok,
и обязательно одним оператором?

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

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

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

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

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


merge
...
Рейтинг: 0 / 0
27.02.2016, 14:33
    #39180534
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
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
27.02.2016, 14:39
    #39180536
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delete и Left Join
genokили в 3.0 он функционально расширился?

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

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


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