Что не так с этим запросом SQL?
Привет
Подскажите что не так с запросом, ругается на ORA-00920: invalid relational operator
SELECT * FROM rpm_future_retail where (item, location, action_date) IN
(select item, location, MAX(ACTION_DATE) action_date from rpm_future_retail
group by item, location HAVING MAX(action_date) < SYSDATE order by item)
На всякий случай укажу тут еще вариант решения до которого сам в итоге дошел:
CREATE VIEW EX6
AS SELECT item, LOCATION, MAX(action_date) action_date FROM rpm_future_retail
GROUP BY item, location HAVING MAX(action_date) <= SYSDATE ORDER BY item;
SELECT ex6.item, ex6.location, ex6.action_date, rpm_future_retail.selling_retail actual_price FROM ex6
LEFT JOIN rpm_future_retail ON ex6.item = rpm_future_retail.item AND ex6.location = rpm_future_retail.location AND ex6.action_date = rpm_future_retail.action_date;
Всем спасибо!
Дополнительно:
edward_freedom, приглашаю как знатока.
where (item, location, action_date) IN (select item, location, MAX(ACTION_DATE) action_date from rpm_future_retail group by item, location HAVING MAX(action_date) < SYSDATE order by item) |
where (item, location, action_date) IN (select item, location, MAX(ACTION_DATE) action_date from rpm_future_retail group by item, location HAVING MAX(action_date) < SYSDATE order by item)
Это вообще законно? Я конечно понимаю, что вы имели ввиду, но помоему в sql так нельзя. Могу конечно ошибаться, поэтому пишу это здесь в комментарии, а не в ответе.
Это вообще законно?
Да, законно. В Оракле это просто expression list, а вообще это называется ROW constructor.
См. https://docs.oracle.com/cd/B19306_01/server.102/b1... - самый первый пример.
Попробуйте так
SELECT t1.* FROM rpm_future_retail t1 INNER JOIN ( select item, location, MAX(ACTION_DATE) action_date from rpm_future_retail group by item, location HAVING MAX(action_date) < SYSDATE order by item ) t2 ON (t1.item = t2.item and t1.location = t2.location and t1.action_date = t2.action_date) |
SELECT t1.* FROM rpm_future_retail t1 INNER JOIN ( select item, location, MAX(ACTION_DATE) action_date from rpm_future_retail group by item, location HAVING MAX(action_date) < SYSDATE order by item ) t2 ON (t1.item = t2.item and t1.location = t2.location and t1.action_date = t2.action_date)
- ORA-00905: missing keyword выдает
- nikimiki7,
HAVING MAX(action_date) < SYSDATE order by item)
в конце скобка не нужна
- insighter, а нет, все работает :) И скобочка нужна, иначе ругается что правая скобка не найдена. Спасибо!
Ответы:
upd. Ответ не правильный.
Вы неправильно используете оператор in
where (item, location, action_date) IN
Оператор должен использоваться для одного поля, а вы указываете несколько.
IN Condition
- Вы неправы. Обратите внимание на вторую диаграмму - она явно описывает набор expr, перечисленных через запятую.
А если перейти по ссылке в Expression List - то там самый первый пример прям-таки один в один. - Akina, Вот блин, не знал про Expression Lists. Спасибо.
- idShura, Ну вообще тут Оракл, как обычно, выступил поперёк. Другие СУБД называют такую штуку Row constructor. Т.е. список выражений (обычно в скобках) формирует как бы временный набор записей (из одной, если там скаляр, либо из нескольких, если подзапрос).
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы выявить проблему с запросом SQL, необходимо проанализировать сам запрос и возможные ошибки в нем. Возможные причины проблемы могут быть следующими:
1. Синтаксическая ошибка: Проверьте правильность написания запроса. Убедитесь, что все ключевые слова и имена таблиц/столбцов написаны правильно.
2. Отсутствие обязательных условий: Если запрос не возвращает ожидаемый результат, убедитесь, что в запросе указаны все необходимые условия для выборки данных.
3. Неправильное использование операторов: Проверьте правильность использования операторов сравнения, логических операторов и функций в запросе.
4. Проблемы с типами данных: Проверьте соответствие типов данных в условиях запроса и типов данных в базе данных.
5. Наличие дублирующихся записей: Если запрос возвращает дублирующиеся записи, убедитесь, что используются правильные операторы для исключения дубликатов.
Пример исправления запроса:
SELECT column1, column2 FROM table WHERE condition = 'value';
Если после исправления запроса проблема не решена, уточните детали и предоставьте больше информации о структуре базы данных, ожидаемом результате и конечной цели запроса для более точного анализа и помощи.