Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос ВладимируМ: SELECT-SQL / 4 сообщений из 4, страница 1 из 1
30.08.2004, 07:31
    #32670406
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос ВладимируМ: SELECT-SQL
Здравствуйте, Владимир.
Судя по Вашим ответам в разных форумах, Вы неплохо разбираетесь в VFP различных версий.
Мой вопрос заключается в следующем:
Пишу в VFP 5.0 достаточно простой Select:

select a.zon,a.nam,a.opr,b.nam as oper,a.kat,c.nam as kategor ;
from query a,opr b,kateg c;
where a.opr=b.opr and a.kat=c.kat and !deleted() ;
order by 1 ;
into cursor Query1

и получаю невероятный (для меня) результат: в Query1 каждая запись исходного набора имеет несколько копий (т.е., если в Query была одна запись, то в Query1 их уже пять(!) ). Тот же результат получаюЮ если переписать select в виде:

select a.zon,a.nam,a.opr,b.nam as oper,a.kat,c.nam as kategor ;
from ((query a inner join opr b on a.opr=b.opr) inner join kateg c;
on a.kat=c.kat) ;
where !deleted() ;
order by 1 ;
into cursor Query1

Лечится это установкой distinct в select'e. Но почему я сразу не могу получить нужный мне набор записей? Что я делаю не так? Может быть поменять какие-то установки в среде? В FPD указанный первым Select срабатывает без проблем!
...
Рейтинг: 0 / 0
30.08.2004, 09:11
    #32670479
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос ВладимируМ: SELECT-SQL
Не видя самих данных трудно сказать. Возможно, запрос работает правильно. В собственно запросе у Вас только одна ошибка.

Функция Deleted() проверяет статус удаленной записи в текущей рабочей области . А при выполнении команды Select-SQL могут создаваться специфические временные таблицы, открывающиеся в своих рабочих областях. Т.е. использование фнкции Deleted() в запросах по нескольким таблицам в принципе недопустимо. Результат - непредсказуемый.

Для отсечения записей помеченных как удаленные используют специальную глобальную настройку:

SET DELETED ON

Здесь несколько "нелогичная" настройка: ON - учитывает записи помеченные как удаленные, OFF - не учитывает (игнорирует) признак удаленной записи.

Еще одна возможная причина глюка может заключаться в повреждении индексного файла. Повреждение индексного файла до версии VFP6SP5 может быть связано с использованием оптимистической буферизации. Для лечения необходимо дать команду REINDEX на все таблицы источники.

Ну, и наконец, опять же вплоть до версии VFP6SP5 нельзя использовать настройку SET COLLATE отличную от MACHINE. В этом случае будет некорректно работать объединение по некоторым значениям числовых полей. Не попадут в выборку ряд записей.

PS: правльнее писать подобные запросы через JOIN, хотя скобки в нем не нужны.
...
Рейтинг: 0 / 0
30.08.2004, 09:38
    #32670515
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос ВладимируМ: SELECT-SQL
Если для условия
where a.opr=b.opr and a.kat=c.kat and !deleted() ;
для одной записи из а выберется, например, 2 записи из в (по a.opr=b.opr) и 3 записи из с (по a.kat=c.kat), то в результирующей выборке будет 2*3=6 записей.
Т.е произведение - каждая с каждой.
...
Рейтинг: 0 / 0
31.08.2004, 08:54
    #32672472
__GUEST
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос ВладимируМ: SELECT-SQL
ВладимирМ прав, необходимо привести структуру таблиц и запроса. Возможно результирующая таблица денормализована (зависит от полей таблиц входящих в запрос, полей участвующих в выборке и результирующих полей). Надо четко представлять себе в каком виде будет результирующая таблица (форма). Возможно на этом наборе полей необходимо использовать DISTINCT.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос ВладимируМ: SELECT-SQL / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]