Поиск записей в SQL, которых нет в другой таблице

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

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

Если вы хотите найти записи, отсутствующие в table1, используйте следующий запрос:

SQL
Скопировать код
SELECT *
FROM table1 t1
WHERE NOT EXISTS (
    SELECT 1
    FROM table2 t2
    WHERE t1.id = t2.id
);

Конструкция NOT EXISTS позволяет отфильтровать записи из table1, которым не соответствует ни одна запись из table2.

Стратегии для повышения производительности: NOT EXISTS, NOT IN, LEFT JOIN

В зависимости от объема данных в таблицах, вы можете выбрать наиболее подходящую стратегию.

  • Для небольших таблиц — NOT IN
SQL
Скопировать код
SELECT t1.*
FROM table1 t1
WHERE t1.id NOT IN (SELECT id FROM table2);

NOT IN прекрасно подходит для работы с небольшими объемами данных.

  • Для больших объемов данных — NOT EXISTS

NOT EXISTS работает быстрее NOT IN, особенно при обработке больших данных.

  • Вывод всех данных — LEFT JOIN

Запрос всех колонок из table1, отсутствующих в table2.

SQL
Скопировать код
SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.id
WHERE t2.id IS NULL;

Выбор конкретных столбцов

Лучше отказаться от SELECT * в пользу явного указания нужных столбцов, чтобы не нагружать базу данных лишними операциями.

SQL
Скопировать код
SELECT t1.id, t1.name 
FROM table1 t1
WHERE NOT EXISTS (
    SELECT 1
    FROM table2 t2
    WHERE t1.id = t2.id
);

Особенности работы с оптимизатором запросов

Оптимизаторы запросов в SQL могут работать по-разному. Важно выбрать наиболее эффективный подход для вашей системы.

Справление с дубликатами

Использование DISTINCT при работе с JOIN позволяет избежать дублирования записей.

SQL
Скопировать код
SELECT DISTINCT t1.*
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.id
WHERE t2.id IS NULL;

Читаемость кода

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

SQL
Скопировать код
SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.id
WHERE t2.id IS NULL;

Тестирование запросов

Не забывайте периодически проводить тестирование и проверку запросов на тестовых данных.

Своевременное изменение кода при изменении схемы базы данных

При изменении схемы баз данных актуализируйте свой код, заменяя звездочку в SELECT * на конкретные столбцы.

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

Представьте задачу поиска записей, присутствующих в Таблице А, но отсутствующих в Таблице Б, как детективное расследование.

SQL
Скопировать код
SELECT * FROM TableA a WHERE NOT EXISTS (SELECT 1 FROM TableB b WHERE b.id = a.id);

Наш SQL-детектив отыскивает именно те записи, которые не обнаруживаются в Таблице Б!

Повышение эффективности с использованием констант 'x'

В подзапросах NOT EXISTS используются константы — 'x' или 1, для повышения эффективности проверки на наличие записей.

SQL
Скопировать код
SELECT t1.*
FROM table1 t1
WHERE NOT EXISTS (
    SELECT 'x'
    FROM table2 t2
    WHERE t1.id = t2.id
);

Гибкость в применении более совершенных решений — залог успеха

Не забудьте адаптировать свой код в соответствии с растущими объемами данных и изменениями структуры базы данных.

Специфические функции баз данных

Пользуйтесь уникальными возможностями вашей СУБД, например, оператором EXCEPT в PostgreSQL.

В конечном счете, выбор метода поиска отсутствующих записей должен основываться на характере ваших данных. Будь это NOT EXISTS, NOT IN или LEFT JOIN, помните: главное — производительность.

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

  1. Как запросить записи, отсутствующие в другой таблице — Stack Overflow.
  2. PostgreSQL: Документация — Объединение запросов.
  3. Использование функций SQL Server в клаузе WHERE и производительность — MSSQLTips.
  4. Обзор INNER и OUTER JOIN в SQL — Essential SQL.