![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос на поиск ну очень большого числа значений.
Arsenija © (2007-04-02 17:55:00)Имеется таблица test, в которой имеется два столбца (Фамилия и идентификационный номер-ID (уникальное поле). Имеем список искомых ID.
Формируем запрос:
select * from test.dbf where ID IN ("01100300098456","01590506704404","01590506693664","01100300098621","0110030036 2928","01100300127032".................)
Вопрос: если список искомых значений большой (более 10 тыс.), то как сформировать запрос?
Ильичев С.А. (2007-04-03 16:09:00) [1]видимо Arsenija вводит в заблуждение слово "временная"
создать надо просто таблицу, обычную
в конце удалить за ненадобностью
или же использовать повторно, предварительно почистив
StriderMan (2007-04-03 14:49:00) [2]
> Desdechado © (03.04.07 13:53) [35]
> Вообще "Exception String Truncation" не существует. Полный
> тескт ошибки такой "arithmetic exception, numeric overflow,
> or string truncation" и в основном он
ну да, эту ошибку и имею ввиду
> > попробуй ХП с параметром VARCHAR создать, и передать туда
> строчку более 255 символов
> Что, по-твоему, я не проверил и даю утверждения?
> Вот, проверь у себя:
Да, честно сказать, этот пример работает, может действительно в чем-то экзотика была...
кстати, может проблема быть в IBX?
Виталий Панасенко (2007-04-03 14:36:00) [3]Создаешь таблицу из одного поля, ИД в котором. Берешь лопатишь свой входной файл(который на 10000 строк). и ИД пишешь в эту тублицу. Затем делаешь запрос с таблице буржуйской базы, куда эти ИД должны кидаться и обьеденяешь с этой временной таблицей (хоть
> Виталий Панасенко © (03.04.07 12:54) [27]
этим вариантом воспользуйся..:-) )
в итоге запрос вернет либо пустой НД (qrySel.IsEmpty)или же такие ИД , которые есть в таблице-назначении(буржуйской) и во входном файле(из которого ИД перенесли во временную таблицу)
Sergey13 (2007-04-03 14:32:00) [4]> [36] Arsenija © (03.04.07 14:24)
Заливай все во временное хранилище. Далее
select * from Temp_Id T where exists (select 1 from big_table B where T.id=B.id)
получишь список ИД-шников которые уже есть в БД. Далее по вкусу.
Arsenija (2007-04-03 14:24:00) [5]Господа, товарищи, друзья.
Добавлять записи в базу можно только кривым буржуйским софтом (политика фирмы и разработка своего возможна только в будущем, когда повзрослеем). Ограничения на этот процесс описаны в [17].
Посему пока стоит вопрос только о получении информации о повторении записей в базе и в файле на 10тыс (размер может меняться), который хотим добавить в базу. Если в базе уже есть записи с таким ID, то возможно два варианта: 1) сначала удаляем по полученному "черному" списку ручками записи из базы, потом делаем добавление (при условии что заказчик подтвердит повторы ID); 2) возвращаем заказчику файл на 10тыс записей для проведения работы над ошибками (с "черным" списком).
Мне кажется наиболее приемлим вариант [27], [1], [30]. Суть понял. Не понял как реализовать. Если можно поподробнее про временную таблицу, как ее создать или ссылку на ресурс, где это описано. Буду премного благодарен.
Desdechado (2007-04-03 13:53:00) [6]> я на эти грабли давно наступил и не раз.
Может, ты наступил на них в экзотической ситуации?
Вообще "Exception String Truncation" не существует. Полный тескт ошибки такой "arithmetic exception, numeric overflow, or string truncation" и в основном он появляется от проблем с кодировкой передаваемого текста. Так что проверься, а?
> попробуй ХП с параметром VARCHAR создать, и передать туда строчку более 255 символов
Что, по-твоему, я не проверил и даю утверждения?
Вот, проверь у себя:
create procedure New_Procedure (a varchar(32000))
returns (b varchar(32000))
as
begin
b = a;
suspend;
end
и вызов
SELECT * FROM new_procedure(
'123456789012345678901234567890... и т.д. до, например, 300 знаков');
ANB (2007-04-03 13:47:00) [7]
> > Повесить на ID неуникальный индекс для скорости.
>
> Только под ногами мешаться будет. Один фиг все закачивать
> надо.
Группировка пошустрее работать будет.
Впрочем, не совсем понятно, где нужно искать дубли - в основной таблице и дельте или только в дельте.
StriderMan (2007-04-03 13:23:00) [8]
> Desdechado © (03.04.07 13:12) [31]
> StriderMan © (03.04.07 13:06) [29]
> FB1.0 базируется (полностью поддерживает) IB6.0
> А уж FB1.5 и подавно.
> PS не стоит быть таким упертым
дело тут не в упертости, а в том что стоит наверное попробовать, а? я на эти грабли давно наступил и не раз.
попробуй ХП с параметром VARCHAR создать, и передать туда строчку более 255 символов. Вывалится Exception String Truncation
Sergey13 (2007-04-03 13:14:00) [9]> [26] ANB © (03.04.07 12:53)
> Повесить на ID неуникальный индекс для скорости.
Только под ногами мешаться будет. Один фиг все закачивать надо.
Desdechado (2007-04-03 13:12:00) [10]StriderMan © (03.04.07 13:06) [29]
FB1.0 базируется (полностью поддерживает) IB6.0
А уж FB1.5 и подавно.
PS не стоит быть таким упертым
Ильичев (2007-04-03 13:07:00) [11]2 ANB
2 Виталий Панасенко
ну что вы
в первом же ответе концепция такая предложена
просто автор видимо не понял сути, иначе уже бы всё сделал
StriderMan (2007-04-03 13:06:00) [12]
> Desdechado © (03.04.07 12:54) [28]
> StriderMan © (03.04.07 11:11) [16]
> Ты хоть документацию почитай, что ли. Цитата из Langiuage
> Reference для IB6.0
я про FB говорю
> StriderMan © (03.04.07 11:11) [16]
> VARCHAR(255) максимум. по крайней мере в FB 1.5 точно так.
Desdechado (2007-04-03 12:54:00) [13]StriderMan © (03.04.07 11:11) [16]
Ты хоть документацию почитай, что ли. Цитата из Langiuage Reference для IB6.0
• VARCHAR (n)
• n characters
• 1 to 32,765 bytes
• Character set character size determines the maximum number of characters that can fit in 32K
• Variable length CHAR or text string type
• Alternate keywords: CHAR VARYING, CHARACTER VARYING
Автору:
Если постфактум не нужен список дубликатов, то можно:
1. стартовать транзакцию
2. в цикле по тексту делать добавления
3. при ошибке уникальности запоминать проблемный ID
4. продолжать дальше по тексту
5. если после всех ID список проблемных пуст, то подтвердить транзакцию, иначе откатить и сохранить список для передачи "первоисточнику"
Все тривиально.
Виталий Панасенко (2007-04-03 12:54:00) [14]А не проще ли
> StriderMan © (03.04.07 11:02) [13]
?
Загнать эти 10000 во временную таблицу(будет быстро я думаю) и select ... from maintable m
join temptable t
on (m.id=t.id)
ANB (2007-04-03 12:53:00) [15]дамс. юзер сам ищет дубли. опупеть.
Можно одним запросом их выдернуть.
Примерный план работы :
1. Создать постоянную локальную табличку только для закачки ID. Повесить на ID неуникальный индекс для скорости.
2. Парсим файл и инсертами заливаем данные в эту табличку (предположим, она называется TMP_ID). Возможно, если есть возможность, прикрутить ODBC на текстовый файл и гетероненненько одним запросом (совет имховый, без гарантии).
3. select ID, count(*) from TMP_ID group by ID having count(*) > 1 - даст все дубли в грид.
ЮЮ (2007-04-03 11:55:00) [16]Первый этап:
В цикле по текстовому файлу выполняем запрос
select * from test.dbf where ID = :Id
Если запрос возвращает запись добавляем Id в "список" плохих: TStrings, TMemo, TListView, TDrawGrid - на выбор
Если "список" плохих не пуст диалог:
1) Завершить
2) Добавить исключая дубли
3) Добавить, заменяя инф-ию для дублей
Если пуст, то сразу 2)
P.S. + ProgerrBar красивый
Arsenija (2007-04-03 11:47:00) [17]Добавляем либо 10тыс, либо ничего (в случае повтора). Формирование постфактум перечня повторов - неприемлимо. Перечень повторных записей нужен до добавления в таблицу (если имеются повторы, то возможно, что и весь файл на 10 тыс будет отозван заказчиком из производства)
Sergey13 (2007-04-03 11:33:00) [18]> [22] Карелин Артем © (03.04.07 11:30)
А почему прямо?
Карелин Артем (2007-04-03 11:30:00) [19]
> Sergey13 © (03.04.07 11:21) [20]
Через Exception тоже криво ловить.
StriderMan (2007-04-03 11:28:00) [20]
> Что мы делаем тогда: ищем запись - удаляем- начинаем заново
> добавлять 10тыс записей
ну тогда все просто
DELETE FROM TABLEWHERE ID = :ID
вот такой запрос гоняете по всем 10 тыс. айдишникам из файла. потом добавляете что осталось. пойдет?