powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Совместимость кода с vfp ole db provider v9
10 сообщений из 10, страница 1 из 1
Совместимость кода с vfp ole db provider v9
    #33391067
spock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Совместимость кода с vfp ole db provider v9
Есть таблица
Код: plaintext
1.
create table const(id c( 9 ), value c( 9 ), date D)
Содержит она данные, например:
[ 1] - [ Знач1] - [01.01.1980]
[ 1] - [ Знач2] - [01.01.2004]
[ 1] - [ Знач3] - [01.01.2005]

Запросом хочу получить значение (value) и внешний ключ (id) соответсвующий максимальной дате, но по условию, ограничевающему диапозон дат

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT 
 c_vv.value as value, 
 MAX(c_vv.date) as date, 
 c_vv.id as id 
FROM 
 const as c_vv 
WHERE 
 (c_vv.date <= date( 2005 ,  11 ,  18 )) 
GROUP BY 
 c_vv.id 
В итоге ругается на неверноое GROUP BY.
Если же ставлю
Код: plaintext
1.
SET ENGINEBEHAVIOR  70 
то запрос проглатывается. Я понимаю, что в v9 ужесточили запросы, но как мне тогда переписать этот запрос, чтобы он честно отработал в v9?
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391071
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Try this:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
 c_vv.value as value, 
 MAX(c_vv.date) as date, 
 c_vv.id as id 
FROM 
 const as c_vv 
WHERE 
 (c_vv.date <= date( 2005 ,  11 ,  18 )) 
GROUP BY 
  1 , 3 
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391075
spock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey ChTry this:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
 c_vv.value as value, 
 MAX(c_vv.date) as date, 
 c_vv.id as id 
FROM 
 const as c_vv 
WHERE 
 (c_vv.date <= date( 2005 ,  11 ,  18 )) 
GROUP BY 
  1 , 3 


Так если я сгруппирую по 1-му и 3-му полю, то получю не совсем то.
Если взять мой пример данных таблицы, то я получу именно то, что в примере.
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391090
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Try this:
Код: plaintext
1.
SELECT  c_vv.value as value,  c_vv.date,  c_vv.id as id FROM  const as c_vv WHERE c_vv.date in ( select MAX(date) FROM const as tt WHERE c_vv.id=tt.id  )
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391096
spock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey ChTry this:
Код: plaintext
1.
SELECT  ... FROM  ... WHERE c_vv.date in ( select MAX(date) FROM const as tt WHERE c_vv.id=tt.id  )

Думал я об подзапросе, но имхо это полная глупость. Тем более, что под условие WHERE c_vv.date может попасть несколько кортежей с одной и той же датой. Т.е. на одну дату будет несколько строк, в которых могут быть различные згначения (value)

[1] - [знач1] - [01.01.1980]
[1] - [знач2] - [01.01.2004]
[1] - [знач3] - [01.01.2005]
[1] - [знач4] - [01.01.2005]

Т.е. подзапрос вернет 01.01.2005, что и правильно, но на эту дату есть два значения: знач3 и знач4
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391128
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spock Т.е. подзапрос вернет 01.01.2005, что и правильно, но на эту дату есть два значения: знач3 и знач4
Так напишите что Вам надо... Должно же быть условие выбора и из этих значений...
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391210
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi spock!

1) Подзапрос не глупость - а единственно верный вариант решения данной
задачи. Есть несколько видов подзапросов, в частности указанный Сергеем, а
также варианты для извлечения сразу данных для всех ID (т.е. без корреляции
подзапроса с основным запросом) - примеры можно найти поиском, а также в FAQ
на foxclub.ru (может и тут есть, не помню).
2) Если у тебя есть 2 записи на одну дату - то сформулируй правило, по
которому ты определяешь какая из них тебе нужна. если такого правила нет -
то извини, но получишь ОБЕ записи, как же иначе :) Почему запрос должен
выбирать (за тебя) то, о чём его не просят.
P.S. Дополнительное условие на твой диапазон дат ставится в подзапрос.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391286
spock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor Korolyov
1) Подзапрос не глупость - а единственно верный вариант решения данной
задачи. Есть несколько видов подзапросов, в частности указанный Сергеем, а
также варианты для извлечения сразу данных для всех ID (т.е. без корреляции
подзапроса с основным запросом) - примеры можно найти поиском, а также в FAQ
на foxclub.ru (может и тут есть, не помню).
2) Если у тебя есть 2 записи на одну дату - то сформулируй правило, по
которому ты определяешь какая из них тебе нужна. если такого правила нет -
то извини, но получишь ОБЕ записи, как же иначе :) Почему запрос должен
выбирать (за тебя) то, о чём его не просят.
P.S. Дополнительное условие на твой диапазон дат ставится в подзапрос.

Posted via ActualForum NNTP Server 1.3

Да я сам подумав, понял почему он ругается на неверный GROUP BY.
Имеено из-за ситуации, когда на одну дату имеется несколько значений. И какое из значений должен вернуть запрос не понятно.
На самом деле на одну дату не может быть двух записей, этот вариант я уже придумал на ходу.
Меня вот больше смутило, а по каким правилам тогда работал vfp6/7, позволявший выполнять такой запрос.
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33391568
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spock Меня вот больше смутило, а по каким правилам тогда работал vfp6/7, позволявший выполнять такой запрос.
Ничего страшного, я находил ошибки и через 10 лет в своих программах :) Как говорят те, с кем я сейчас работаю: "Welcome to our club!"
...
Рейтинг: 0 / 0
Совместимость кода с vfp ole db provider v9
    #33393625
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi spock!

> Меня вот больше смутило, а по каким правилам тогда работал vfp6/7,
> позволявший выполнять такой запрос.

Обычно выбиралась последняя (в физическом порядке) запись из всей группы.
Это кстати часто играло с программистами злую шутку - в подобных таблицах
как правило записи физически следуют в порядке возрастания дат, и увидев
"правильный" результат многие не задумываются о том как он получен, и будет
ли он всегда правильным :)

P.S. Это тема также неоднократно поднималась на разных форумах. И
приводились примеры неправильной работы запросов с "неполной группировкой" -
которые MSFT совершенно справедливо запретил начиная с VFP8.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Совместимость кода с vfp ole db provider v9
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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