Порахувати загальну кількість рейсів з Ростова і кількість рейсів, пунктом призначення яких не є Москва.
У цьому завданні теж потрібно виконати агрегацію за двома вибірками, при цьому одна з вибірок є підмножиною другої. Тому тут безпосередньо не підійде обчислюваний стовпець, по якому можна виконати угруповання. Це годилося для вирішення попередньої задачі, коли безліч поділялося на власні непересічні підмножини, по кожному з яких було потрібно виконати агрегацію.
Для вирішення даного завдання ми можемо порахувати кількість по всій множині і використовувати підзапит для підрахунку значень в підмножині (друге звернення до таблиці) або використовувати CASE в поєднанні з агрегатної функцією, щоб уникнути повторного читання таблиці. Давайте подивимося, як оцінить оптимізатор ці варіанти.
Використання підзапиту
Використання CASE з агрегатної функцією
Результат, звичайно, буде однаковий:
а ось вартість другого запиту, як і очікувалося, виявилася вдвічі нижче.
Ви можете порівняти реальний час виконання, якщо сгенеріруете достатній обсяг даних.
Другий варіант можна записати більш компактно, якщо використовувати функцію NULLIF - скорочений варіант окремого випадку використання CASE:
Функція NULLIF повертає NULL, якщо її аргументи дорівнюють, або перший аргумент в іншому випадку.
У рішенні використовується той факт, що агрегатні функції не враховують NULL-значення, які з'являються в аргументі функції COUNT тоді, коли місто прибуття дорівнює 'Moscow'.
Попередня [Перетворення типів і оператор CAST]
[Оператори модифікації даних] Наступна
Підручник оновлювався
декілька днів тому