ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Решение ошибки ORA-01791 при использовании DISTINCT и ORDER BY

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вы сталкиваетесь с ошибкой "не SELECT выражение" при использовании DISTINCT, убедитесь, что все столбцы в SELECT, которые не указаны в DISTINCT, используются с агрегатными функциями, если применяется GROUP BY. К агрегатным функциям относятся MAX(), MIN(), SUM(), COUNT(). Вот корректная запись запроса:

SQL
Скопировать код
-- Запрашиваем максимальное время заказа для каждого клиента. Самый последний заказ – самый важный
SELECT DISTINCT customer_id, MAX(order_date) AS latest_order_date
FROM orders
GROUP BY customer_id;

Данный код выдает уникальный customer_id и дату последнего заказа, предотвращая ошибки.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Изучаем DISTINCT и ORDER BY подробно

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

Попытка упорядочить данные по столбцу, не входящему в SELECT DISTINCT, в большинстве случаев приводит к ошибке ORA-01791: не SELECT выражение. Мы должны обеспечить корректную работу SQL.

Чтобы все работало правильно, каждый столбец из ORDER BY следует включить в список SELECT DISTINCT. Пример обновленного запроса:

SQL
Скопировать код
-- Исправляем ошибку, добавив условие ORDER BY
SELECT DISTINCT customer_id, MAX(order_date) AS latest_order_date
FROM orders
GROUP BY customer_id
ORDER BY latest_order_date;

Теперь order_date агрегирован, и у нас есть уникальное значение для каждой группы, что позволяет корректно применить ORDER BY.

Подзапросы: ваш буфер безопасности в SQL

Подзапросы в SQL – полезный инструмент при сложных операциях с DISTINCT и ORDER BY. Структурируйте ваш запрос так, чтобы подзапрос осуществлял выборку с DISTINCT, а внешний запрос применял ORDER BY.

SQL
Скопировать код
-- ПОДЗАПРОС + ВНЕШНИЙ ЗАПРОС: сначала DISTINCT, затем ORDER BY. Превосходная комбинация!
SELECT *
FROM (SELECT DISTINCT column1 FROM table_name) AS subquery
ORDER BY column1;

Тогда SQL будет работать без проблем, сортируя уникальные столбцы из подзапроса, которые затем будут упорядочены внешним запросом.

Лучшие практики при использовании DISTINCT и ORDER BY

Чтобы максимизировать эффективность использования DISTINCT и ORDER BY, следуйте следующим рекомендациям:

  1. Агрегатные функции: Применяйте MAX(), MIN() и подобные функции к столбцам, которые не входят в SELECT DISTINCT.
  2. Согласованный список столбцов: Убедитесь, что столбцы в SELECT DISTINCT и в ORDER BY совпадают. Это поможет избежать ошибок.
  3. Мощь подзапросов: Используйте подзапросы для отделения DISTINCT и создания чистой структуры кода без ошибок.

История о фоторежиме DISTINCT

Возьмем в качестве примера конкурс фотографий, где каждый участник представляет уникальные работы:

Markdown
Скопировать код
Участники:       👤1 = [📸, 📸, 📷] 
                  👤2 = [📸, 📷, 📸]
                  👤3 = [📷, 📷, 📷]

Логика DISTINCT работает так:

Markdown
Скопировать код
🖼️ Галерея (DISTINCT):
- [📸, 📷]
# В галерею включены только уникальные снимки.

Ошибка: Подход "снимок от участника" в данном случае приведет к ошибке "не SELECT выражение":

Markdown
Скопировать код
❌ Неверный подход: 📸 от 👤1, 📷 от 👤2. 

✅ Правильный подход:
- Сопоставьте все детали (👤+📸)
- Используйте DISTINCT для всех выбранных элементов.

Помните, что SQL должен обеспечить связывание каждого уникального снимка с его автором.

Полезные материалы

  1. SQL SELECT DISTINCT Statement – Oсновы использования ключевого слова DISTINCT в SQL.
  2. SELECT – Официальная документация Oracle на использование DISTINCT.
  3. SQL DISTINCT | Intermediate SQL – Mode – Погрузитесь глубже в примеры использования SQL DISTINCT.
  4. SQL | GROUP BY – GeeksforGeeks – Различия между работой GROUP BY и DISTINCT.
  5. Handling SQL DISTINCT Correctly in Complex Queries – Отточите мастерство применения DISTINCT в сложных запросах.