SQL-запрос для поиска записи с идентификатором не в другой таблице


у меня есть две таблицы с обязательным первичным ключом в базе данных, и я хочу найти непересекающиеся между ними. Например,

  • Table1 столбцы (ID, Name) и данных примера: (1 ,John), (2, Peter), (3, Mary)
  • Table2 столбцы (ID, Address) и данных примера: (1, address2), (2, address2)

Итак, как мне создать SQL-запрос, чтобы я мог получить строку с идентификатором от table1 это не table2. В этом случае (3, Mary) должна быть возвращена?

Ps. идентификатор является первичным ключом для таблицы.

спасибо заранее.

5 72

5 ответов:

попробуй такое

SELECT ID, Name 
FROM   Table1 
WHERE  ID NOT IN (SELECT ID FROM Table2)

использовать 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;

имея в виду точки, сделанные в комментарии/ссылке @John Woo выше, вот как я обычно справляюсь с этим:

SELECT t1.ID, t1.Name 
FROM   Table1 t1
WHERE  NOT EXISTS (
    SELECT TOP 1 NULL
    FROM Table2 t2
    WHERE t1.ID = t2.ID
)
SELECT COUNT(ID) FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For count


SELECT ID FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For results