![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]И в чем же кривизна то ? И что лечить ?