SQL-запрос для поиска записи с идентификатором не в другой таблице
у меня есть две таблицы с обязательным первичным ключом в базе данных, и я хочу найти непересекающиеся между ними. Например,
-
Table1
столбцы (ID, Name
) и данных примера:(1 ,John), (2, Peter), (3, Mary)
-
Table2
столбцы (ID, Address
) и данных примера:(1, address2), (2, address2)
Итак, как мне создать SQL-запрос, чтобы я мог получить строку с идентификатором от table1
это не table2
. В этом случае (3, Mary)
должна быть возвращена?
Ps. идентификатор является первичным ключом для таблицы.
спасибо заранее.
5 ответов:
использовать
LEFT JOIN
SELECT a.* FROM table1 a LEFT JOIN table2 b on a.ID = b.ID WHERE b.id IS NULL
Быстрая Альтернатива
Я провел несколько тестов (на postgres 9.5), используя две таблицы с ~2M строк каждая. Этот запрос ниже выполнен по крайней мере на 5* лучше, чем другие предложенные запросы:
-- Count SELECT count(*) FROM ( (SELECT id FROM table1) EXCEPT (SELECT id FROM table2) ) t1_not_in_t2; -- Get full row SELECT table1.* FROM ( (SELECT id FROM table1) EXCEPT (SELECT id FROM table2) ) t1_not_in_t2 JOIN table1 ON t1_not_in_t2.id=table1.id;