ORA-01791: не выбранное выражение в ORDER

Вопрос или проблема

Когда я применяю ORDER BY, я получаю ошибку ORA-01791: не выбранное выражение, и у меня нет идеи, что произошло, не могли бы вы сказать мне, что мне делать?

Выбрать отличные
FL.MEANING||’ : ‘||FL.Tag||’ : ‘||FL.DESCRIPTION как BU_NAME
из
FND_LOOKUPS FL
ВНУТРЕННЕЕ СОЕДИНЕНИЕ FUN_ALL_BUSINESS_UNITS_V fabuv на FL.DESCRIPTION = fabuv.BU_NAME
где
FL.LOOKUP_TYPE = ‘MINOR BU’

ORDER BY FL.MEANING

Ответ или решение

Ошибка ORA-01791: not a SELECTed expression возникает в Oracle SQL, когда вы пытаетесь использовать выражение в предложении ORDER BY, которое не включено в основной SELECT-запрос. В вашем случае это происходит из-за попытки отсортировать результаты по полю FL.MEANING, которое не присутствует в вашем списке выбора.

Ваша текущая SQL-запрос выглядит следующим образом:

SELECT DISTINCT
    FL.MEANING || ' : ' || FL.Tag || ' : ' || FL.DESCRIPTION AS BU_NAME
FROM
    FND_LOOKUPS FL
INNER JOIN 
    FUN_ALL_BUSINESS_UNITS_V fabuv ON FL.DESCRIPTION = fabuv.BU_NAME
WHERE
    FL.LOOKUP_TYPE = 'MINOR BU'
ORDER BY 
    FL.MEANING

Пояснение ошибки

В предложении ORDER BY вы ссылаетесь на поле FL.MEANING, которое не включено в выборку. Чтобы исправить эту ошибку, вы должны включить FL.MEANING в список SELECT. Обратите внимание, что для DISTINCT вы можете столкнуться с почти идентичной проблемой, если это выражение не уникально.

Решение проблемы

Для устранения ошибки, вам нужно изменить запрос, чтобы поле FL.MEANING было выбрано. Пример исправленного запроса:

SELECT DISTINCT
    FL.MEANING || ' : ' || FL.Tag || ' : ' || FL.DESCRIPTION AS BU_NAME,
    FL.MEANING -- Включаем FL.MEANING в выборку
FROM
    FND_LOOKUPS FL
INNER JOIN 
    FUN_ALL_BUSINESS_UNITS_V fabuv ON FL.DESCRIPTION = fabuv.BU_NAME
WHERE
    FL.LOOKUP_TYPE = 'MINOR BU'
ORDER BY 
    FL.MEANING

Альтернативное решение

Если самой целью является лишь упорядочивание результата по FL.MEANING, вы можете изменить ваш запрос так, чтобы отбирать только необходимые поля, избегая использования DISTINCT, если это возможно. Например:

SELECT 
    FL.MEANING || ' : ' || FL.Tag || ' : ' || FL.DESCRIPTION AS BU_NAME
FROM
    FND_LOOKUPS FL
INNER JOIN 
    FUN_ALL_BUSINESS_UNITS_V fabuv ON FL.DESCRIPTION = fabuv.BU_NAME
WHERE
    FL.LOOKUP_TYPE = 'MINOR BU'
ORDER BY 
    FL.MEANING

Заключение

Обратите внимание на порядок полей и выражений в предложении SELECT и ORDER BY. Если вы включаете какие-либо поля в ORDER BY, они должны быть либо частью самого SELECT, либо являться выражениями, которые могут быть уникально определены на основе выбранных данных. Проверяйте свои запросы на предмет удовлетворения этих условий, чтобы избежать ошибок в дальнейшем и обеспечить корректное выполнение SQL-запросов.

Оцените материал
Добавить комментарий

Капча загружается...