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

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

Query глючит? [D1, D5, D6, dBase, FoxPro]


Vladimir* ©   (2002-09-13 10:31:00) 

Hello All!
Вот такая конструкция
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.ADD("SELECT COUNT(DISTINCT NMB1) FROM BAZA");
Query2.SQL.ADD(" WHERE NMB2 ="+""""+f4+"""");
Query2.SQL.ADD(" AND PERIOD BETWEEN "+""""+f5+"""");
Query2.SQL.Add(" AND "+""""+f6+"""");
Query2.Open;
работает правильно, если у DBF-таблицы (BAZA) нет индекса, а если есть, то совсем даже криво((
Посоветуйте, плз, как лечить?


Val   (2002-09-13 16:10:00) [1]

>Vladimir* (13.09.02 16:00)
по поводу вложенных запросов см. Local SQL Help->Views


Vladimir*   (2002-09-13 16:00:00) [2]

ага, попробовал, а в ответ
NESTED SELECT NOT SUPPOR
во бли!
сделал уже индекс уникальный, один хрен, считает неправильно((


Val   (2002-09-13 15:13:00) [3]

>Vladimir* (13.09.02 14:52)
так это, все кнопки в руки :)


Vladimir*   (2002-09-13 14:52:00) [4]

кстати, а вложенные запросы типа select ... from (select ... ) она понимает?


Vladimir*   (2002-09-13 14:29:00) [5]

BAZA - dbf table
NMB1, NMB2, PERIOD - символьные поля, построен индекс c тегом NMB2+PERIOD.
Так вот запрос
Query1.Close;
Query1.SQL.Clear;
Query1.DatabaseName:="E:\BAZA";
Query1.SQL.ADD("SELECT COUNT(NMB1) FROM BAZA");
Query1.SQL.ADD(" WHERE NMB2 ="+ """+f4+""");
Query1.SQL.ADD(" AND PEROID BETWEEN "+"""+f5+""");
Query1.SQL.ADD(" AND "+"""+f6+""");
Query1.Open;
возвращает количество записей по полю NMB1, удовлетворяющих условию NMB2=F4 и лежащих в диапазоне PERIOD от F5 до F6, правильно, их 60 записей, и не важно, с индексом таблица или нет.

а вот запрос
Query2.Close;
Query2.SQL.Clear;
Query2.DatabaseName:="E:\BAZA";
Query2.SQL.ADD("SELECT COUNT(DISTINCT NMB1) FROM BAZA");
Query2.SQL.ADD(" WHERE NMB2 ="+"""+f4+""");
Query2.SQL.ADD(" AND PERIOD BETWEEN "+"""+f5+""");
Query2.SQL.Add(" AND "+"""+f6+""");
Query2.Open;
по идее должен возвращать количество НЕПОВТОРЯЮЩИХСЯ записей по полю NMB1, удовлетворяющих условию NMB2=F4 и лежащих в диапазоне PERIOD от F5 до F6, но...
если индексного файла нет (таблица не индексирована), тогда получается 15 записей, и это правильный ответ,
но если таблица индексирована, тогда почему-то 59...
что за хрень??


VAleksey   (2002-09-13 13:14:00) [6]

Запросик работает. В чем кривизна ?


VAleksey   (2002-09-13 13:09:00) [7]

Я что-то так и не уловил в чем кривизна. Пожалуйста пример таблички. И пример того что возвращает запрос из проиндексированной таблицы а что из не проиндексированной.
И вообще подобный запрос работоет ?
Конечно проверю ..., но просто сейчас сомнения одолели :).


Vladimir*   (2002-09-13 13:01:00) [8]

ни хрена он не отключает(( <>0


ЮЮ   (2002-09-13 11:13:00) [9]

>можно его отключить как-то?
ИЗМЕНИ условие, например,
WHERE NB2<>0 and NMB2 ="+""""+f4+""""AND .
Условие с <> приводит к полному сканированию таблицы, тем самым "отключая" индексы


Val   (2002-09-13 11:06:00) [10]

drop index..
query..
create index..


Vladimir*   (2002-09-13 10:58:00) [11]

да пробовал все, даже в фоксе пересчитывал, и с Query и
ручками считал, репу морщил, вывод один - индекс мешает.
хотя по идее не должен...
можно его отключить как-то?


Val   (2002-09-13 10:52:00) [12]

попробуйте сделать выборку с подзапросом, типа
select count(nmb1) from
(select distinct nmb1 from...)


ЮЮ   (2002-09-13 10:51:00) [13]

Для начала поставь * вместо COUNT(DISTINCT NMB1) и сравни, какие записи возвращаются в первом случае, а какие во втором. От того и пляши


Vladimir*   (2002-09-13 10:41:00) [14]

Так чтоб и индексом считала ПРАВИЛЬНО!


Johnmen   (2002-09-13 10:35:00) [15]

И в чем же кривизна то ? И что лечить ?


Наверх

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