powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Циклическое удаление
25 сообщений из 35, страница 1 из 2
Циклическое удаление
    #39852696
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Возникла необходимость удалять из множества таблиц данные по id из другой таблицы, например:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select id1, id2 from main_table where id3=12345
delete from table1 where id=id1
delete from table2 where id=id2
delete from table3 where id=id1
delete from table4 where id=id2
delete from table5 where id=id1
delete from table6 where id=id1
delete from table7 where id=id2
delete from table8 where id=id2



если в MS SQL это делается просто через:
Код: sql
1.
2.
3.
4.
declare
@id3 varchar;
set @id3='t0987654321'
...



то в Postgre он ругается сразу на синтаксис "@"
Как в данному скуле провернуть тоже самое?
...
Рейтинг: 0 / 0
Циклическое удаление
    #39852707
YuriyRusinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
    id3 varchar;
begin
    id3 := 't0987654321';
    ...
end
$BODY$
language 'plpgsql';
...
Рейтинг: 0 / 0
Циклическое удаление
    #39852709
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasДоброго времени суток!
Возникла необходимость удалять из множества таблиц данные по id из другой таблицы, например:


то в Postgre он ругается сразу на синтаксис "@"
Как в данному скуле провернуть тоже самое?


Странный "данный скуль", не хочет понимать "синтаксис @"
...
Рейтинг: 0 / 0
Циклическое удаление
    #39852721
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuriyRusinov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SQL Error [42601]: Unterminated dollar quote started at position 143 in SQL declare
    id4 varchar;
begin
    id4 := 't0987654321';
    select id1, id2 from main_table where id3=id4;
end
$BODY$
language 'plpgsql';. Expected terminating $$



Я попытался сделать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
DO $$
DECLARE 
id4 varchar;
BEGIN
    id4 := 't0987654321';
    select id1, id2 from main_table where id3=id4;	
END $$;


Но выдаёт:
Код: sql
1.
2.
3.
SQL Error [42601]: ERROR: query has no destination for result data
  Подсказка: If you want to discard the results of a SELECT, use PERFORM instead.
  Где: PL/pgSQL function inline_code_block line 6 at SQL statemen



ставлю вместо
Код: sql
1.
2.
3.
4.
select id1, id2 from main_table where id3=id4;
---
perform (select id1 from main_table where id3=id4;)
perform (select id2 from main_table where id3=id4;)


отрабатывает, но результат не выдаёт
...
Рейтинг: 0 / 0
Циклическое удаление
    #39852728
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasYuriyRusinov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SQL Error [42601]: Unterminated dollar quote started at position 143 in SQL declare
    id4 varchar;
begin
    id4 := 't0987654321';
    select id1, id2 from main_table where id3=id4;
end
$BODY$
language 'plpgsql';. Expected terminating $$



Я попытался сделать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
DO $$
DECLARE 
id4 varchar;
BEGIN
    id4 := 't0987654321';
    select id1, id2 from main_table where id3=id4;	
END $$;


Но выдаёт:
Код: sql
1.
2.
3.
SQL Error [42601]: ERROR: query has no destination for result data
  Подсказка: If you want to discard the results of a SELECT, use PERFORM instead.
  Где: PL/pgSQL function inline_code_block line 6 at SQL statemen



ставлю вместо
Код: sql
1.
2.
3.
4.
select id1, id2 from main_table where id3=id4;
---
perform (select id1 from main_table where id3=id4;)
perform (select id2 from main_table where id3=id4;)


отрабатывает, но результат не выдаёт

"данный скуль" результат выдает, но, видимо, вы ожидаете что-то другое.
Нету взаимопонимания, как и в жизни, собственно.
...
Рейтинг: 0 / 0
Циклическое удаление
    #39852733
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, вместо того, чтоб оставлять свои язвительные комментарии, которые явно не к месту, лучше бы помогли разобраться новичку, в противном случае попрошу не комментировать
...
Рейтинг: 0 / 0
Циклическое удаление
    #39852749
YuriyRusinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда же вы начнете читать документацию ? Сделано все вопиюще неверно, если MS SQL позволяет себе какие-то вольности по интерпретации стандарта, то это не означает, что все остальные диалекты позволяют делать также.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace function cyclicRemove (int4, int4) returns int4 as
$BODY$
declare
    arg1 alias for $1;
    arg2 alias for $2;
    id3 varchar;
    r record;
    delquery varchar;
begin
    id3 := 't0987654321';
    for r in
        select id1, id2 from main_table mt where mt.id3 = <...>
    loop
        delquery := E'delete from table' || <...> || E' where id=' || <...>;
        perform delquery;
    end loop;
end;
$BODY$
language 'plpgsql';
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853149
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasРолг Хупин, вместо того, чтоб оставлять свои язвительные комментарии, которые явно не к месту, лучше бы помогли разобраться новичку, в противном случае попрошу не комментировать

мои комментарии - в тему.
Вы не осознаете, с чем вы работаете, что вы делаете. "Новичок" - означает..., как минимум тот, кто пытается разобраться, читает документацию и т.д.А не тот, кто хочет за три минуты не думая что-то замутить по-быстрому, а то аж тошнит.
Вы хотите чтобы сделали скрипт вы скопировали его, пустили и забыли? будьте осторожны, люди иогут шутить.

Читайте выше не мой комментарий "Когда же вы начнете читать документацию ? Сделано все вопиюще неверно"
Но форум вас не научит.
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853169
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин"данный скуль" результат выдает, но, видимо, вы ожидаете что-то другое.
Нету взаимопонимания, как и в жизни, собственно.

...
Рейтинг: 0 / 0
Циклическое удаление
    #39853199
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuriyRusinovКогда же вы начнете читать документацию ? Сделано все вопиюще неверно, если MS SQL позволяет себе какие-то вольности по интерпретации стандарта, то это не означает, что все остальные диалекты позволяют делать также.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace function cyclicRemove (int4, int4) returns int4 as
$BODY$
declare
    arg1 alias for $1;
    arg2 alias for $2;
    id3 varchar;
    r record;
    delquery varchar;
begin
    id3 := 't0987654321';
    for r in
        select id1, id2 from main_table mt where mt.id3 = <...>
    loop
        delquery := E'delete from table' || <...> || E' where id=' || <...>;
        perform delquery;
    end loop;
end;
$BODY$
language 'plpgsql';



Здесь можно и без цикла, если вот так
Код: plsql
1.
 delquery := E'delete from table' || <...>;
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853220
YuriyRusinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен, но автор темы не описал ни набора таблиц, из которых надо удалять, ни критериев удаления.
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853249
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинЗдесь можно и без цикла, если вот так
Код: plsql
1.
 delquery := E'delete from table' || <...>;


Это если текст delete необходимо именно собирать частями. А то можно и сразу без perform
Код: sql
1.
delete from table where id = id1;
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853333
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijРолг ХупинЗдесь можно и без цикла, если вот так
Код: plsql
1.
 delquery := E'delete from table' || <...>;


Это если текст delete необходимо именно собирать частями. А то можно и сразу без perform
Код: sql
1.
delete from table where id = id1;



Можно так
Код: plsql
1.
delete from table where id = id1 or id != id1;;
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853488
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuriyRusinov, я же писал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select id1, id2 from main_table where id3=12345
delete from table1 where id=id1
delete from table2 where id=id2
delete from table3 where id=id1
delete from table4 where id=id2
delete from table5 where id=id1
delete from table6 where id=id1
delete from table7 where id=id2
delete from table8 where id=id2
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853490
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, а так же там написано "если MS SQL позволяет себе какие-то вольности по интерпретации стандарта, то это не означает, что все остальные диалекты позволяют делать также". Мне не приходилось работать со "строгими" диалектами и языками программирования, я могу спокойно сделать такое на MS SQL/firebird вместе с C++/python, но тут я прочитал уже много литературы, но всё равно не совсем понимаю как собрать поиск и удаление воедино
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853548
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasРолг Хупин, а так же там написано "если MS SQL позволяет себе какие-то вольности по интерпретации стандарта, то это не означает, что все остальные диалекты позволяют делать также". Мне не приходилось работать со "строгими" диалектами и языками программирования, я могу спокойно сделать такое на MS SQL/firebird вместе с C++/python, но тут я прочитал уже много литературы, но всё равно не совсем понимаю как собрать поиск и удаление воедино

Не знаю, что такое "диалекты" языков программирования.
SQL - не язык программирования.
И еще - не путайте T-SQL и pl/pgsql, у вас получается дикая смесь.
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853624
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, попрошу, SQL - это декларативный язык программирования. И у меня не было фразы ""диалекты" языков программирования.", попрошу так же не коверкать мои слова
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853649
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasРолг Хупин, попрошу, SQL - это декларативный язык программирования . И у меня не было фразы ""диалекты" языков программирования.", попрошу так же не коверкать мои слова

даже не просите

Посмотрите на эти три буквы:
SQL - Structured Query Language

Как говорил проф. Преображенский: не читайте википедию на руском языке, сравните с английским текстом
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853651
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, сравнил..."SQL (/ˌɛsˌkjuːˈɛl/ (About this soundlisten) S-Q-L,[4] /ˈsiːkwəl/ "sequel"; Structured Query Language)[5][6][7][8] is a domain-specific language used in programming..." предметно-ориентированный язык, используемый в программировании...
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853671
YuriyRusinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasYuriyRusinov, я же писал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select id1, id2 from main_table where id3=12345
delete from table1 where id=id1
delete from table2 where id=id2
delete from table3 where id=id1
delete from table4 where id=id2
delete from table5 where id=id1
delete from table6 where id=id1
delete from table7 where id=id2
delete from table8 where id=id2



Здесь не прослеживается закономерностей ни в названиях таблиц, ни в том по какому-именно id в какой таблице надо удалять. И из Вашего начального запроса из main_table следует, что id1 и id2 -- это некоторые наборы чисел, а не одно число.
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853679
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuriyRusinov, в main_table по id3 вcегда хранится один набор id1 и id2
А вот в таблицах на удаление уже хранятся разные данные коих по указанному id(1,2) может быть действительно много
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853701
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasРолг Хупин, сравнил..."SQL (/ˌɛsˌkjuːˈɛl/ (About this soundlisten) S-Q-L,[4] /ˈsiːkwəl/ "sequel"; Structured Query Language)[5][6][7][8] is a domain-specific language used in programming..." предметно-ориентированный язык, используемый в программировании...

Почему вы сделали обрезание?

"and designed for managing data"

Это язык запросов , DML, DDL etc.
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853706
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, "and" - "и", то есть суть сказанного мной не меняется. То есть и одно, и другое. Не вижу противоречий в то, что я написал
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853721
YuriyRusinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MalfasYuriyRusinov, в main_table по id3 вcегда хранится один набор id1 и id2
А вот в таблицах на удаление уже хранятся разные данные коих по указанному id(1,2) может быть действительно много

Откуда это следует ? Структуры таблиц в данной теме нет. Из чего следует, что в таблице table5 удаление происходит по id1, а в таблице table7 по id2 ?
...
Рейтинг: 0 / 0
Циклическое удаление
    #39853725
Malfas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuriyRusinov, потому что таблицы так связаны table5.id=main_table.id1, а table7.id=main_table.id2
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Циклическое удаление
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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