Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Совместимость кода с vfp ole db provider v9  [new]
spock
Member

Откуда: Новосибирск
Сообщений: 37
Совместимость кода с vfp ole db provider v9
Есть таблица
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) соответсвующий максимальной дате, но по условию, ограничевающему диапозон дат

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.
Если же ставлю
SET ENGINEBEHAVIOR 70
то запрос проглатывается. Я понимаю, что в v9 ужесточили запросы, но как мне тогда переписать этот запрос, чтобы он честно отработал в v9?
21 ноя 05, 21:06    [2091948]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
Try this:

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
21 ноя 05, 21:10    [2091952]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
spock
Member

Откуда: Новосибирск
Сообщений: 37
Sergey Ch
Try this:

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-му полю, то получю не совсем то.
Если взять мой пример данных таблицы, то я получу именно то, что в примере.
21 ноя 05, 21:14    [2091960]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
Try this:
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  )
21 ноя 05, 21:23    [2091976]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
spock
Member

Откуда: Новосибирск
Сообщений: 37
Sergey Ch
Try this:
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
21 ноя 05, 21:34    [2091992]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
spock
Т.е. подзапрос вернет 01.01.2005, что и правильно, но на эту дату есть два значения: знач3 и знач4

Так напишите что Вам надо... Должно же быть условие выбора и из этих значений...
21 ноя 05, 22:15    [2092086]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi spock!

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

Posted via ActualForum NNTP Server 1.3

22 ноя 05, 01:50    [2092367]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
spock
Member

Откуда: Новосибирск
Сообщений: 37
Igor Korolyov

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

Posted via ActualForum NNTP Server 1.3


Да я сам подумав, понял почему он ругается на неверный GROUP BY.
Имеено из-за ситуации, когда на одну дату имеется несколько значений. И какое из значений должен вернуть запрос не понятно.
На самом деле на одну дату не может быть двух записей, этот вариант я уже придумал на ходу.
Меня вот больше смутило, а по каким правилам тогда работал vfp6/7, позволявший выполнять такой запрос.
22 ноя 05, 07:32    [2092465]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
spock
Меня вот больше смутило, а по каким правилам тогда работал vfp6/7, позволявший выполнять такой запрос.

Ничего страшного, я находил ошибки и через 10 лет в своих программах :) Как говорят те, с кем я сейчас работаю: "Welcome to our club!"
22 ноя 05, 10:22    [2092913]     Ответить | Цитировать Сообщить модератору
 Re: Совместимость кода с vfp ole db provider v9  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi spock!

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

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

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

Posted via ActualForum NNTP Server 1.3

23 ноя 05, 00:39    [2097200]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить