Что не так с этим запросом SQL?

Ссылка скопирована
1 ответ

Привет
Подскажите что не так с запросом, ругается на 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) &lt; 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) &lt; SYSDATE order by item)

    Это вообще законно? Я конечно понимаю, что вы имели ввиду, но помоему в sql так нельзя. Могу конечно ошибаться, поэтому пишу это здесь в комментарии, а не в ответе.

  • Сергей Водаков, а можете подсказать как законно?)
  • Сергей Водаков,

    Это вообще законно?

    Да, законно. В Оракле это просто expression list, а вообще это называется ROW constructor.

    См. https://docs.oracle.com/cd/B19306_01/server.102/b1... - самый первый пример.

  • Akina, Да, но что же все-таки не так с первоначальным запросом?
  • Попробуйте так

    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) &lt; 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) &lt; 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. Т.е. список выражений (обычно в скобках) формирует как бы временный набор записей (из одной, если там скаляр, либо из нескольких, если подзапрос).
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Игорь Волков Ответ

    Для того чтобы выявить проблему с запросом SQL, необходимо проанализировать сам запрос и возможные ошибки в нем. Возможные причины проблемы могут быть следующими:

    1. Синтаксическая ошибка: Проверьте правильность написания запроса. Убедитесь, что все ключевые слова и имена таблиц/столбцов написаны правильно.

    2. Отсутствие обязательных условий: Если запрос не возвращает ожидаемый результат, убедитесь, что в запросе указаны все необходимые условия для выборки данных.

    3. Неправильное использование операторов: Проверьте правильность использования операторов сравнения, логических операторов и функций в запросе.

    4. Проблемы с типами данных: Проверьте соответствие типов данных в условиях запроса и типов данных в базе данных.

    5. Наличие дублирующихся записей: Если запрос возвращает дублирующиеся записи, убедитесь, что используются правильные операторы для исключения дубликатов.

    Пример исправления запроса:

    SELECT column1, column2
    FROM TABLE
    WHERE condition = 'value';

    SELECT column1, column2 FROM table WHERE condition = 'value';

    Если после исправления запроса проблема не решена, уточните детали и предоставьте больше информации о структуре базы данных, ожидаемом результате и конечной цели запроса для более точного анализа и помощи.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно