Конференция "Базы" » Создать запрос из списка значений полей [D7, Access]
 
  • Alex_C (31.10.11 14:08) [0]
    Не соображу, как более правильно создать следующий запрос:
    есть TStringList, в каждой строке которой содержащий три значения для трех полей таблицы "Иванов / Иван / Иванович". Необходимо получить выборку, соответствую всем значениям TStringList, причем количество данных может быть несколько тысяч.
    Думаю сделать так при помощи TRANSFORM :

     SQL := 'WHERE (';
     for i := 0 to S.Count - 1 do
     ...<извлекаю из S.Strings[i] данные по отдельности>
       SQL := SQL + '(' +A.Familia = ' + Familia + ' AND A.Imja = ' +
         Imja +  '
    AND A.Otch = ' + Otch + ')' ;
       if i <> S.Count - 1 then
          SQL := SQL + '
    OR ';



    Т.е. получается как то так. На сколько такой запрос верный? Или можно как то более красиво это сделать?
  • Ega23 © (31.10.11 14:17) [1]
    sql := 'where (0=0)';
    for i := 0 to S.Count - 1 do
     sql := sql + ' or (имя=..., фамилия=..., )';

  • Ega23 © (31.10.11 14:18) [2]

    > причем количество данных может быть несколько тысяч.


    Убил бы. Оперируй ID
  • Alex_C (31.10.11 14:31) [3]

    > Оперируй ID

    А каким образом? Я как раз понимаю, что делать такую выборку некузяво, но как из БД выбрать несколько тысяч человек по запросу?
  • Омлет © (31.10.11 14:33) [4]
    Представь, какого размера будет запрос при тысячах строк..
    Можно сохранить стринг лист в виде текстового csv-файла и указывать его как таблицу, которую просто джойнить с условием.
    В соседней ветке это обсуждали: http://pda.delphimaster.net/?id=1319962304&n=1

    Но есть подозрение, что в архитектуре косяк. Ибо зачем хранить тысячи ФИО в стринглисте?
  • Ega23 © (31.10.11 14:34) [5]

    > но как из БД выбрать несколько тысяч человек по запросу?


    А ты точно уверен, что пользователю нужны все эти тысячи человек одновременно?
    Практика показывает, что пользователю нужно то, что помещается в данный момент на экран.
  • Alex_C (31.10.11 14:52) [6]

    > пользователю нужны все эти тысячи человек одновременно?


    Да. Это специфика программы )) На самом деле там не фамилии, получиться должен итоговый список районов для определенной страны.
    Т.е. выборка из общей БД такая: пользователь задает, данные о районах какой страны он хочет получить. В России допустим около 2800 районов.
    И вот из БД нужно выбрать:
    Страна - Россия, Область - [идет список выбранных областей], Район - [идет список выбранных районов]. Причем естественно необходимо учитывать, что допустим Ленинский или Октябрьский районы есть практически во всех областях.
    Наверное как я понял, самое правильное

    > охранить стринг лист в виде текстового csv-файла и указывать
    > его как таблицу, которую просто джойнить с условием.
  • Anatoly Podgoretsky © (31.10.11 14:52) [7]
    > Ega23  (31.10.2011 14:17:01)  [1]

    Цикл смылс не имеет, первое условие уже выпоненено: 'where (0=0)'  + OR +
    И дальнейшие условия уже не влияют.
  • Медвежонок Пятачок © (31.10.11 14:58) [8]
    where
    позиция('$'+fam+' '+name+' ' + otch+'$',<целиковый_список_в_виде_текста_с разделителями-долларами>) > 0
  • sniknik © (31.10.11 17:40) [9]
    > Представь, какого размера будет запрос при тысячах строк..
    обрезанный и нерабочий... (там есть какое то ограничение на длину запроса, не помню точную цифру)

    > Убил бы. Оперируй ID
    влезет больше
    WHERE ID IN (1,2,3...,1000)
  • Ega23 © (31.10.11 17:56) [10]

    > 'where (0=0)'  + OR +


    Тьфу, блин, очепятка. where (0=1), конечно.
  • Ega23 © (31.10.11 17:57) [11]

    > Т.е. выборка из общей БД такая: пользователь задает, данные
    > о районах какой страны он хочет получить. В России допустим
    > около 2800 районов.


    3 запроса через мастер-деталь
  • Труп Васи Доброго © (01.11.11 07:43) [12]

    > Страна - Россия, Область - [идет список выбранных областей],
    >  Район - [идет список выбранных районов]. Причем естественно
    > необходимо учитывать, что допустим Ленинский или Октябрьский
    > районы есть практически во всех областях.

    Отбить руки архитектору БД, если всё это в одной таблице хранится, если же в трёх разных, то ты неправильно понял или неправильно объясняешь задачу.
  • sniknik © (01.11.11 08:14) [13]
    > Отбить руки архитектору БД, если всё это в одной таблице хранится
    кладр... уже без кук? ;)
  • Труп Васи Доброго © (01.11.11 08:21) [14]
    Не поминай это овно, КЛАДР наверное ключница делала. Может сейчас что то исправили, давно с ним не работал, но то, что я видел лет 5 назад это ППЦ. Создатель либо полный профан, причём с дикого бодуна писал и слово нормализация для него просто звук, либо с.ка вредитель.
  • Alex_C (01.11.11 08:24) [15]
    Спасибо за советы. Думал вариант с текстовыми условиями будет проще, но поразмыслив, понял что нифига не проще.
    Попробую более подробно объяснить задачу.
    Есть база данных. Пользователю необходимо предусмотреть выборку по значениям практически ЛЮБЫХ комбинаций полей. Для примера:
    в основной базе есть поля: Страна, Город, Район - текстовые поля. Поле Свойство1 - текстовое поле, принемающее одно из 10 значений, логические поля Подтверждение1, Подтверждение2.
    В качестве значений выборки предполагается использовать вторую таблицу с полями Страна, Город, Район с введенными в нее нужными данными.
    В итоге должна получится таблица
    Страна, Город, Район, Значение1_Свойство1...Значение10_Свойство1,
    где в строках Значение1_Свойство1...Значение10_Свойство1 прописано кол-во Подтверждение1/Подтверждение2.
    Ранее все это я делал с помощью компонента VolgaTable. Но там просто приходилось перебирать все записи БД, и заносить данные в итоговую таблицу. Сейчас переделываю программу для работы с Access.
  • sniknik © (01.11.11 08:32) [16]
    > Может сейчас что то исправили
    неа, во всяком случае год назад, сталкивался, не было. и не собиралось. тут еще вопрос обратной совместимости...
    хотя, если бы я занимался, что за проблема? при нормально сформированных справочниках сделать конвертацию можно во что угодно, а вот наоборот, из кривого в нормальное часто нереально.
    т.е. формируем нормальную структуру и выкладываем вместе с "конвертером в совместимый со старым формат".
  • Труп Васи Доброго © (01.11.11 08:33) [17]
    Тьфу, тьфу, тьфу!!! Забудь слово "база данных"!!! Нет такого! Какие есть ТАБЛИЦЫ??? Структуру их опиши и связи между ними! Твое описание похоже на вопрос: "У меня есть склад, где есть яйца, мука, соль, варенье и много всего. Как мне запросом выбрать пустые пирожки и занести туда начинку?"
  • sniknik © (01.11.11 08:40) [18]
    > во всяком случае год назад
    во блин, время летит... посмотрел свойства проекта, изменен - 19 февраля 2010 г. т.е. уже 2 года назад. ;(
  • Alex_C (01.11.11 08:54) [19]

    > Какие есть ТАБЛИЦЫ???


    В общем есть такие люди - радиолюбители. :) Раньше они вели аппаратный журнал (регистрация радиосвязей) на бумаге. Сейчас на компьютере.
    Есть основная таблица, содержащая данные на каждую радиолюбительскую связь, куда вносятся Позывной, Имя, Город, Район, Страна ... <Еще некоторые специфические данные>, дале поля Диапазон и Модуляция, которыми проверена связь (выбираются из списка), логические поля Отсылки подтверждения и Получения подтверждения контакта.
    Пользователю нужно иметь возможность увидеть (для получения радиолюбительских дипломов) допустим с какими странами из списка есть радиосвязь, или же с какими районами США и Канады. При этом слева идут названия стран или районов, а в качестве столбцов - разбивка по диапазонам.
    Идея в том, чтобы пользователю дать возможность самому формировать условия выборки по нужным полям.
    Вот как то так :)
 
Конференция "Базы" » Создать запрос из списка значений полей [D7, Access]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]