Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизSQL-запрос Найти похожие ветки
← →
Dionnis (2004-08-21 21:39) [0]Добрый вечер всем! У меня такой вопрос:
Чрез ADO выполняется следующий запрос (провайдер Microsoft OLE DB
Provider for Visual FoxPro) к dbf файлу:
SELECT POL, VID, RIGHT(DATR, 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, RIGHT(DATR, 4)
ORDER BY RIGHT(DATR, 4) DESC;
При его выполнении происходит ошибка:
SQL: GROUP BY clause is missing or invalid
Если выполнить импорт dbf файла в формат Accsess, то запрос замечательно работает.
В чём загвоздка? Или может синтаксис запроса драйвер для FoxPro не поддерживает?
Кто знает подскажите пожалуйста!
← →
Наталия © (2004-08-22 12:28) [1]Я не слишком уверена, но разве в Localsql есть такая функция - RIGHT? Ты help смотрел?
← →
Anatoly Podgoretsky © (2004-08-22 13:34) [2]АДО к Localsql отношения не имеет. А смотреть надо возможности провайдера, какой синтаксис он поддерживает, вероятно ему не нравится групировка по функции.
← →
Dionnis (2004-08-22 15:18) [3]В документации по провайдеру приведён пример:
SELECT last_name,LEFT(notes,100) AS notes2 from employee GROUP BY last_name, notes2;
Но если написать мой запрос аналогично, т.е:
SELECT POL, VID, RIGHT(DATR, 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;
Тогда возникает другая ошибка:
"Function argument value, type or count is invalid"
Вместо функции RIGHT(DATR, 4) пробовал писать EXTRACT(YEAR FROM DATR), т.е. запрос
выглядит следующим образом:
SELECT POL, VID, EXTRACT(YEAR FROM DATR) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;
в этом
случае возникает ошибка:
"Function name is missing )"
← →
Flagman © (2004-08-22 15:52) [4]Насколько я понимаю, DATR - поле типа Date...
А RIGHT - строковая функция...
Попробуй привести к DATR к строке.
Не в курсе, как эта функция называется в FoxPro, но что-то вроде такого должно получиться:
SELECT POL, VID, RIGHT(DATE_TO_STR(DATR), 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;
"Function argument value, type or count is invalid" - это он ругается на несовпадение типов в аргументе функции - т.е. RIGHT не работает напрямую с Date.
← →
Dionnis (2004-08-22 17:13) [5]Возможно вы правы, но только возникает другая ошибка:
"File "date_to_str.prg" does not exist", то есть не находит такой функции.
← →
Flagman © (2004-08-22 17:17) [6]>Не в курсе, как эта функция называется в FoxPro
>А смотреть надо возможности провайдера, какой синтаксис он поддерживает
Посмотри, какая функция в FoxPro используется для преобразования в строку. Я ж говорю, что-то вроде, но за точность названия функции не ручаюсь.
← →
Dionnis (2004-08-22 20:57) [7]> Посмотри, какая функция в FoxPro используется для преобразования
> в строку. Я ж говорю, что-то вроде, но за точность названия
> функции не ручаюсь.
Спасибо большое за подсказки, вроде нашёл то что нужно это функция Year(Date):
SELECT POL, VID, YEAR(DATR) AS DR, COUNT(*) AS KOLVO FROM DELO WHERE (DATR >= %s) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6) AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR ORDER BY DR DESC
Запрос выполняется и ошибок не возникает, но теперь мой Query (класса TADOQuery) возвращает RecordCount = 0; 8-((
← →
Flagman © (2004-08-22 21:22) [8]WHERE (DATR >= %s) Это что? Если %s - это параметр, то стоит проверить, что ты в него передаешь. Может в таблице и нет DATR >= %s...
Попробуй условия по одному поубирать, глядишь и найдешь, где собака порылась ;)
Кстати, при сравнении с NULL обычно ставится не "= NULL" и "<> NULL", а "is NULL" и "is not NULL", хотя это, конечно, вряд ли повлияет... IMHO, скорее всего %s неправильно воспринимается...
← →
Dionnis © (2004-08-23 10:03) [9]
> WHERE (DATR >= %s) Это что? Если %s - это параметр, то стоит
> проверить, что ты в него передаешь. Может в таблице и нет
> DATR >= %s...
%s - это естественно параметр, просто забыл его на дату заменить.
А (<> NULL) и (IS NOT NULL) действительно не одно и то же!!!
Спасибо огромное за подсказки!!! Запрос теперь работает замечательно!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c