Вопрос или проблема
Когда я применяю 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-запросов.