Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос на поиск ну очень большого числа значений.


Страницы:   1 2

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 тыс. айдишникам из файла. потом добавляете что осталось. пойдет?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо