|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
Задал в разделе 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.
Под Access все прекрасно работает... Но почему оно не работает под VFP9 - выдает всего одну строку! И что в этом решении надо поменять для того чтобы оно работало и под FoxPro? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2010, 23:02 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
Если подобный запрос работает в Access, то это означает, что диалект SQL в Access очень сильно отличается от стандарта, поскольку подзапрос не коррелированный. Нет ссылки на запись таблицы T1. Но вообще-то, это стандартный запрос на поиск максимального значения. Слегка модифицированный. Поэтому и решение стандартное. Код: plaintext 1. 2. 3.
Однако в случае если от какого-либо солдата расстояние до ближайщего офицера и справа и слева будет одинаково, то полчится "лишняя" запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2010, 10:55 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
Ошибся со знаком. Надо заменить "больше" на "меньше", ведь нужно минимальное значение найти (минимальную дистанцию), а не максимальное... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2010, 11:03 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
ВладимирМ, К сожалению, приведенный Вами запрос не рабочий (XP, VFP9). Ни со знаком ">", ни со знаком "<". Вы предварительно проверили его работоспособность, прежде чем выдать "на гора", или так - в "уме" прикинули? Возможно, Вам было некогда создать две простейших таблицы для проверки, поэтому высылаю архив с ними, приложенный к этому сообщению, в котором также помещен простейший запрос - не полностью решающий эту задачу, т.к. в результате нет данных офицера, но имеющий одно существенное достоинство - он "рабочий", т.е. предварительно проверен... Также там, в прилагающемся архиве приведена база данных Access с тестовыми таблицами и тремя РАБОТАЮЩИМИ запросами, взятыми из ответов по ссылке, приведенной мной в здесь, в первом сообщении на соответствующий раздел форума по MS Access. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2010, 00:08 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
Почему то не приложился файл архива. Пробую ещё раз... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2010, 00:20 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
Неблольшая ремарка: запрос в тестовом архиве из директории VFP9 следует заменить на Код: plaintext
т.к. старый был рассчитан на другое название поля: теперь T1.n вместо старого T1.id ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2010, 00:29 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
И все же, кто-нибудь проверял на работоспособность запрос, приведенный Владимиром (Member - ВладимирМ)? И если он действительно нерабочий, то кто-нибудь может привести работающуюю модификацию запроса под VFP9 на основе работающего запроса под MS Access, приведенного мною ранее в примере из архива test.zip в директории - "Acess", БД - "test.mdb", запрос - "Запрос1"? Очень за Фоксу обидно... Понимаешь... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2010, 16:58 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2010, 00:04 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
Да. Не проверил. FoxPro не поддерживает в условиях связи коррелированных запросов выражения. Только прямое указание полей. Ну, т.е. только выражения вида "where T1.X < T2.X", а написанное мной условие не пропустит. В принципе, можно обойти, написав 2 подзапроса: один для поиска ближайшего офицера слева, второй для поиска ближайшего офицера справа и сравнить два найденных значения. Только слишком уж громоздко получается. Думаю, проще будет сделать через группировку как в последнем примере. Т.е. 2 последовательных запроса. Если время терпит, попробую завтра поэкспериментировать... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2010, 00:12 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
А что, прям-таки необходимо это делать через SQL ? Ах, ну да, а как же. А пробежаться простым сканом по базам ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2010, 17:49 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
rewareА что, прям-таки необходимо это делать через SQL ? Ах, ну да, а как же. А пробежаться простым сканом по базам ?Дык ясное дело, сканом было бы совсем просто и очень даже ясно. В реальности любые задачи нужно делать прежде всего так, чтобы все работало, а потом искать пути либо оптимизации производительности, либо оптимизации кода, а лучше все вместе. Но в данно случае вопрос стоит о возможности перенесения конкретного SQL-запроса из Access в FoxPro. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2010, 18:32 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
igorbik Но в данно случае вопрос стоит о возможности перенесения конкретного SQL-запроса из Access в FoxPro. Ну, будем точнее, не самого запроса, а результирующего курсора (?). Ну и переносите его в ваш любимый Access. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2010, 19:49 |
|
Создать запрос, Задачка о ближайшем офицере
|
|||
---|---|---|---|
#18+
Нет reware, igorbik прав. Изначально задача должна была быть решена для связки Delphi - ADO Jet 4.0 - т.е. по сути в среде MS Access (как на тренеровочном полигоне). Поэтому я и обратился на их форум: и она там была решена - и ссылку, и даже пример базы я приводил выше. Но так случилось, что изначально я проверял приведенные в Access-овском разделе форума решения на Фоксе и... с удивление обнаружил, что в ней эти решения не работают... Если с двумя последними решениями из приведенных трех было все более или менее понятно - просто различия в синтаксисе (и кстати, igorbik это блестяще доказал, приведя второй запрос к удобоваримому FoxPro-шному виду - за что ему отдельный респект!), то первый запрос при всей своей, казалось бы, внешней синтаксической "безобидности" работать в среде VFP9 наотрез отказался... Поэтому никаким сканом никуда, reware, бегать не надо... и переносить в Access тоже не надо... Она и так изначально там. А там и так все работает! Так что вопрос теперь носит чисто академический академический характер, как Вам справедливо заметил Уважаемый igorbik - ведь речь идет о Чести FoxPro, если Вы понимаете о чем я говорю... Которая, кстати, как раз и есть "любимая" - первой любви не изменишь, а никакой ни Access, как Вы позволили себе заметить. Access же просто навязан бизнес-обстоятельствами, вытекающими из политики всем известной фирмы-производителя операционной системы: ведь поддержка ADO Jet 4.0 предопределена (начиная с XP кажется) даже на "лысой" ОС и не требует никаких дополнительных манипуляций. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2010, 03:06 |
|
|
start [/forum/topic.php?fid=41&fpage=92&tid=1585065]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 397ms |
total: | 525ms |
0 / 0 |