powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Может кто помочь с запросом?
4 сообщений из 4, страница 1 из 1
Может кто помочь с запросом?
    #39751409
egorthik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость


Слева Таблица - она временная. На самом деле это файл с разделителем \t
Просто на сколько я знаю, СУБД внутри базы работает быстрее, чем из файла...

Суть проблемы: Файл состоит из множества строк: каждая строка разбита на 3 строки ( data1,data2,data3 в таблице File_or_TMPTable)
Таблицы Table1, Table2, Table3 имеют следующий вид:
Table№
{
id bigserial NOT NULL,
data varchar(52) NOT NULL unique
};


Задача:
из таблицы ТМП или файла добавлять data1, data2,data3 в таблицы t1,t2,t3 ( буду сокращённо, думаю, понятно), забирать ID ,добавленного и эти id связывать в таблице4

Например:(\t отделю парой пробелов)
Вот такие строки из файла/таблицы ТМП:
TMP
iddata1data2data31string1drow1ccr52string1drow1ccr53string1drow2ccr5

Должны записаться вот так:
T1
iddata1 string1

T2
iddata1 drow12drow2

T3
iddata1 ccr5

T4
idID_T1ID_T2ID_T3111121113121


Я пробовал напрямую читать из файла строки своей программой и формировать запрос - получалось медленно ( 1000 строк в секунду)
Вот теперь бьюсь над ускорением.

Добавляю данные в T1,T2,T3 через
INSERT ..... ON CONFLICT

Пробовал писать через WITH - не получилось.

Сейчас написал костыльно - через 6 запросов. Но это довольно медленно, но быстрее, чем 1000стр/с.


Прошу тапками не кидаться, учу SQL только 1.5 недели
...
Рейтинг: 0 / 0
Может кто помочь с запросом?
    #39751424
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorthik,

Возможно помогут индексы на поля data таблиц Table1, Table2, Table3.

а дальше в цикле

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
for x in (select t.*, t1.id id1, t2.id id2, t3.id  id3 from
 tmptable t
 left join table1 t1 on t1.data = data1
 left join table1 t2 on t2.data = data2
 left join table1 t3 on t3.data = data3
) loop
 if x.id1 is null then --Если данные не были найдены при запросе из for
   select id into x.id1 from table1 where data = x.data1; --Повторно спросим друг в рамках текущей операции данные уже добавили
   if x.id1 is null then --если все таки нет то добавим сейчас
     insert into table1(data) values (x.data1) returning id into x.id1;
   end if;
 end if;
 --..Тот же самый if для таблицы 2 и 3
 
 insert into table4(id_t1,id_t2,id_t3) values (x.id1, x.id2, x.id3);

end loop;
...
Рейтинг: 0 / 0
Может кто помочь с запросом?
    #39751450
egorthik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111,

Спасибо большое , вечером опробую и сообщу результаты
...
Рейтинг: 0 / 0
Может кто помочь с запросом?
    #39751519
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorthik,

а вообще сначала можно актуализировать таблицы table1..2..3 а затем вставлять данные

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
insert into table1(data) values (select distinct data1 from tmpTable except select data from table1);
insert into table2(data) values (select distinct data2 from tmpTable except select data from table2);
insert into table3(data) values (select distinct data3 from tmpTable except select data from table3);
insert into table4(id_t1,id_t2,id_t3) values (select t1.id id1, t2.id id2, t3.id  id3 from
 tmptable t
 inner join table1 t1 on t1.data = data1
 inner join table1 t2 on t2.data = data2
 inner join table1 t3 on t3.data = data3);



Но таблица tmpTable должны быть достачно быстрой для 4-х последовательных чтений
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Может кто помочь с запросом?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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