Выборка из SQL-таблицы с отсутствующими в другой пар
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для того чтобы исключить строки с заданными значениями в нескольких столбцах, наиболее эффективно использовать функцию NOT EXISTS
с подзапросом. Ниже приведён пример, иллюстрирующий метод, который позволит отфильтровать ненужные значения из таблицы your_table
:
-- Заказываю пиццу, только ананасы пожалуйста, не добавляйте!
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
.
Рассмотрение альтернатив и возможных проблем
Тем, кто в SQL разбирается как в своих пяти пальцах и не боится новых вызовов предлагается рассмотреть альтернативные методы и возможные ограничения:
- Конкатенация строк: Можно рассмотреть использование
NOT IN
с несколькими столбцами через конкатенацию строк. Однако, подобный подход требует осмотрительности: как правильное смешивание коктейля – нужно соблюдать пропорции. Конкатенация может замедлить исполнение запроса и вызвать ложные срабатывания, если разделитель уже присутствует в данных.
-- Это не ракетная наука – при условии, что вы не строите ракету 😊
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!
-- К 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
покажут себя в лучшем свете, благодаря более эффективным планам выполнения и хорошей поддержке индексов.
Визуализация
Представьте ситуацию, когда вы фильтруете нежелательных гостей [👻] на своей вечеринке. Вам предстоит двойная проверка:
На первой двери 🚪 вы отсеиваете гостей из "чёрного списка" [👻].
На второй двери 🚪 проверяется, являются ли приглашения гостей "недействительными" [👻].
Таким образом, ваш SQL запрос `NOT IN` аналогичен двухэтапному отбору гостей на вашем мероприятии 🎉.
Выбор подхода
Для оптимального подхода в выборе техники исходя из условий задачи руководствуйтесь следующими рекомендациями:
- Объем данных небольшой? Простым решением может быть
NOT IN
с конкатенацией строк. - Объем данных большой? Заботитесь о производительности? Выбирайте
NOT EXISTS
илиLEFT JOIN
. - NULL вызывает раздражение? Используйте
LEFT JOIN
илиNOT EXISTS
. - Важна читабельность кода больше, чем небольшие улучшения в производительности? Выберите метод, который более наглядно отображает ваше намерение в коде.
Выбор всегда должен быть осознанным! Учитывайте особенности вашей задачи, тестируйте на реальных данных и используйте подход, нацеленный на максимальную эффективность и минимум затрат на поддержку.
Полезные материалы
- Что такое IN и OUT в SQL – всё что нужно знать о
NOT IN
. - Мастер-класс по подзапросам в SQL – углублённое изучение подзапросов.
- Сравнение NOT EXISTS и NOT IN – практические рекомендации от сообщества StackOverflow.
- Упражнения по подзапросам для нескольких столбцов – подробное руководство Oracle.
- Обработка NULL с помощью LEFT JOIN – инструкции PostgreSQL по работе с LEFT JOIN и значениями NULL.