Выборка из SQL-таблицы с отсутствующими в другой пар

Пройдите тест, узнайте какой профессии подходите

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

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

Для того чтобы исключить строки с заданными значениями в нескольких столбцах, наиболее эффективно использовать функцию NOT EXISTS с подзапросом. Ниже приведён пример, иллюстрирующий метод, который позволит отфильтровать ненужные значения из таблицы your_table:

SQL
Скопировать код
-- Заказываю пиццу, только ананасы пожалуйста, не добавляйте!
SELECT *
FROM your_table
WHERE NOT EXISTS (
    -- Ананасы? Не, спасибо!
    SELECT 1
    FROM (VALUES ('val1'), ('val2')) AS exc(value)
    WHERE your_table.col1 = exc.value OR your_table.col2 = exc.value
)

Здесь подзапрос генерирует таблицу exc и проверяет отсутствие совпадающих значений в столбцах col1 и col2 из your_table с значениями в таблице exc.

Кинга Идем в IT: пошаговый план для смены профессии

Рассмотрение альтернатив и возможных проблем

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

  • Конкатенация строк: Можно рассмотреть использование NOT IN с несколькими столбцами через конкатенацию строк. Однако, подобный подход требует осмотрительности: как правильное смешивание коктейля – нужно соблюдать пропорции. Конкатенация может замедлить исполнение запроса и вызвать ложные срабатывания, если разделитель уже присутствует в данных.
SQL
Скопировать код
-- Это не ракетная наука – при условии, что вы не строите ракету 😊
SELECT *
FROM your_table
WHERE CONCAT(col1, ',', col2) NOT IN (
    SELECT CONCAT(val1, ',', val2)
    FROM exclusion_table
)
  • Использование LEFT JOIN для обхода NULL: Хорошо знакомый LEFT JOIN может послужить эффективным решением, чтобы обойти проблемы с NULL в использовании NOT IN. В SQL сравнение с NULL всегда возвращает результат FALSE!
SQL
Скопировать код
-- К LEFT JOIN я отношусь как к хорошему старому другу!
SELECT DISTINCT t1.*
FROM your_table t1
LEFT JOIN exclusion_table t2
ON t1.col1 = t2.col1 AND t1.col2 = t2.col2
WHERE t2.col1 IS NULL AND t2.col2 IS NULL
  • Оптимизация производительности: Тут всё про скорость! NOT EXISTS и LEFT JOIN покажут себя в лучшем свете, благодаря более эффективным планам выполнения и хорошей поддержке индексов.

Визуализация

Представьте ситуацию, когда вы фильтруете нежелательных гостей [👻] на своей вечеринке. Вам предстоит двойная проверка:

Markdown
Скопировать код
На первой двери 🚪 вы отсеиваете гостей из "чёрного списка" [👻].
На второй двери 🚪 проверяется, являются ли приглашения гостей "недействительными" [👻].

Таким образом, ваш SQL запрос `NOT IN` аналогичен двухэтапному отбору гостей на вашем мероприятии 🎉.

Выбор подхода

Для оптимального подхода в выборе техники исходя из условий задачи руководствуйтесь следующими рекомендациями:

  • Объем данных небольшой? Простым решением может быть NOT IN с конкатенацией строк.
  • Объем данных большой? Заботитесь о производительности? Выбирайте NOT EXISTS или LEFT JOIN.
  • NULL вызывает раздражение? Используйте LEFT JOIN или NOT EXISTS.
  • Важна читабельность кода больше, чем небольшие улучшения в производительности? Выберите метод, который более наглядно отображает ваше намерение в коде.

Выбор всегда должен быть осознанным! Учитывайте особенности вашей задачи, тестируйте на реальных данных и используйте подход, нацеленный на максимальную эффективность и минимум затрат на поддержку.

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

  1. Что такое IN и OUT в SQL – всё что нужно знать о NOT IN.
  2. Мастер-класс по подзапросам в SQL – углублённое изучение подзапросов.
  3. Сравнение NOT EXISTS и NOT IN – практические рекомендации от сообщества StackOverflow.
  4. Упражнения по подзапросам для нескольких столбцов – подробное руководство Oracle.
  5. Обработка NULL с помощью LEFT JOIN – инструкции PostgreSQL по работе с LEFT JOIN и значениями NULL.