powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создать запрос, Задачка о ближайшем офицере
13 сообщений из 13, страница 1 из 1
Создать запрос, Задачка о ближайшем офицере
    #36770311
Barklay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задал в разделе Microsoft Access вопрос:


BarklayЕсть две одинаковых по структуре таблицы (Т1-солдаты и Т2-офицеры), состоящие всего из двух полей:

1) N - номер записи
2) X - координата на прямой (в "окопе") объекта (солдата или офицера в зависимости от таблицы)

Необходимо каждому солдату подобрать ближайшего к нему офицера,
т.е. в результате запроса получить результирующую таблицу,
состоящую из данных о солдате и о единственном ближайшем офицере,
дистанция abs(T2.X-T1.X) до которого от этого солдата минимальна:

T1.N, T1.X, T2.N, T2.X, min_Dist

Получил три решения.

Первое решение оказалось самым удачным:
Код: plaintext
1.
2.
3.
select T1.N, T1.X, T2.N, T2.X, abs(T1.X-T2.X) as min_Dist
from T1, T2
where abs(T1.X-T2.X) = (select min(abs(T1.X-T3.X)) from T2 T3)

Под Access все прекрасно работает...
Но почему оно не работает под VFP9 - выдает всего одну строку!
И что в этом решении надо поменять для того чтобы оно работало и под FoxPro?
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36770586
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если подобный запрос работает в Access, то это означает, что диалект SQL в Access очень сильно отличается от стандарта, поскольку подзапрос не коррелированный. Нет ссылки на запись таблицы T1.

Но вообще-то, это стандартный запрос на поиск максимального значения. Слегка модифицированный. Поэтому и решение стандартное.

Код: plaintext
1.
2.
3.
select T1.N, T1.X, T2.N, T2.X, abs(T1.X-T2.X) as min_Dist ;
from T1, T2 ;
where NOT EXISTS(select  1  from T2 T3 where abs(T1.X-T3.X) > abs(T1.X-T2.X)) 

Однако в случае если от какого-либо солдата расстояние до ближайщего офицера и справа и слева будет одинаково, то полчится "лишняя" запись.
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36770608
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся со знаком. Надо заменить "больше" на "меньше", ведь нужно минимальное значение найти (минимальную дистанцию), а не максимальное...
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36772031
Barklay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,

К сожалению, приведенный Вами запрос не рабочий (XP, VFP9).
Ни со знаком ">", ни со знаком "<".

Вы предварительно проверили его работоспособность, прежде чем выдать "на гора",
или так - в "уме" прикинули?

Возможно, Вам было некогда создать две простейших таблицы для проверки, поэтому высылаю архив с ними, приложенный к этому сообщению, в котором также помещен простейший запрос - не полностью решающий эту задачу, т.к. в результате нет данных офицера, но имеющий одно существенное достоинство - он "рабочий", т.е. предварительно проверен...

Также там, в прилагающемся архиве приведена база данных Access с тестовыми таблицами и тремя РАБОТАЮЩИМИ запросами, взятыми из ответов по ссылке, приведенной мной в здесь, в первом сообщении на соответствующий раздел форума по MS Access.
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36772042
Barklay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему то не приложился файл архива.

Пробую ещё раз...
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36772047
Barklay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неблольшая ремарка: запрос в тестовом архиве из директории VFP9 следует заменить на

Код: plaintext
SELECT T1.n, T1.x, MIN(ABS(T1.x-T2.x)) AS del FROM T1, T2 GROUP BY T1.n, T1.x

т.к. старый был рассчитан на другое название поля: теперь T1.n вместо старого T1.id
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36775649
Barklay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все же, кто-нибудь проверял на работоспособность запрос, приведенный Владимиром (Member - ВладимирМ)?

И если он действительно нерабочий, то кто-нибудь может привести работающуюю модификацию запроса под VFP9 на основе работающего запроса под MS Access, приведенного мною ранее в примере из архива test.zip в директории - "Acess", БД - "test.mdb", запрос - "Запрос1"?

Очень за Фоксу обидно... Понимаешь...
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36776182
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarklayИ все же, кто-нибудь проверял на работоспособность запрос, приведенный Владимиром (Member - ВладимирМ)?

И если он действительно нерабочий, то кто-нибудь может привести работающуюю модификацию запроса под VFP9 на основе работающего запроса под MS Access, приведенного мною ранее в примере из архива test.zip в директории - "Acess", БД - "test.mdb", запрос - "Запрос1"?

Очень за Фоксу обидно... Понимаешь...

А почему не воспользоваться другим вариантом оттуда же?

SELECT Q.id AS Солдат, T2.name As Офицер, Q.d As Дистанция ;
FROM (;
SELECT T1.id, T1.X, Min(Abs(T2.X-T1.X)) AS d ;
FROM T1, T2 ;
GROUP BY T1.id, T1.X) As Q, T2 ;
WHERE Q.d=Abs(T2.X-Q.X) ;
ORDER BY 1
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36776191
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Не проверил. FoxPro не поддерживает в условиях связи коррелированных запросов выражения. Только прямое указание полей. Ну, т.е. только выражения вида "where T1.X < T2.X", а написанное мной условие не пропустит.

В принципе, можно обойти, написав 2 подзапроса: один для поиска ближайшего офицера слева, второй для поиска ближайшего офицера справа и сравнить два найденных значения. Только слишком уж громоздко получается. Думаю, проще будет сделать через группировку как в последнем примере. Т.е. 2 последовательных запроса. Если время терпит, попробую завтра поэкспериментировать...
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36777933
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, прям-таки необходимо это делать через SQL ? Ах, ну да, а как же. А пробежаться простым сканом по базам ?
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36778027
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewareА что, прям-таки необходимо это делать через SQL ? Ах, ну да, а как же. А пробежаться простым сканом по базам ?Дык ясное дело, сканом было бы совсем просто и очень даже ясно. В реальности любые задачи нужно делать прежде всего так, чтобы все работало, а потом искать пути либо оптимизации производительности, либо оптимизации кода, а лучше все вместе.
Но в данно случае вопрос стоит о возможности перенесения конкретного SQL-запроса из Access в FoxPro.
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36778186
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igorbik
Но в данно случае вопрос стоит о возможности перенесения конкретного SQL-запроса из Access в FoxPro.
Ну, будем точнее, не самого запроса, а результирующего курсора (?). Ну и переносите его в ваш любимый Access.
...
Рейтинг: 0 / 0
Создать запрос, Задачка о ближайшем офицере
    #36778572
Barklay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет reware,

igorbik прав.

Изначально задача должна была быть решена для связки Delphi - ADO Jet 4.0 - т.е. по сути в среде MS Access (как на тренеровочном полигоне).
Поэтому я и обратился на их форум: и она там была решена - и ссылку, и даже пример базы я приводил выше.

Но так случилось, что изначально я проверял приведенные в Access-овском разделе форума решения на Фоксе и... с удивление обнаружил, что в ней эти решения не работают...

Если с двумя последними решениями из приведенных трех было все более или менее понятно - просто различия в синтаксисе (и кстати, igorbik это блестяще доказал, приведя второй запрос к удобоваримому FoxPro-шному виду - за что ему отдельный респект!), то первый запрос при всей своей, казалось бы, внешней синтаксической "безобидности" работать в среде VFP9 наотрез отказался...

Поэтому никаким сканом никуда, reware, бегать не надо... и переносить в Access тоже не надо...
Она и так изначально там. А там и так все работает!

Так что вопрос теперь носит чисто академический академический характер, как Вам справедливо заметил Уважаемый igorbik - ведь речь идет о Чести FoxPro, если Вы понимаете о чем я говорю... Которая, кстати, как раз и есть "любимая" - первой любви не изменишь, а никакой ни Access, как Вы позволили себе заметить.

Access же просто навязан бизнес-обстоятельствами, вытекающими из политики всем известной фирмы-производителя операционной системы: ведь поддержка ADO Jet 4.0 предопределена (начиная с XP кажется) даже на "лысой" ОС и не требует никаких дополнительных манипуляций.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создать запрос, Задачка о ближайшем офицере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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