Mysql: выберите строки из таблицы, которые не находятся в другом

Как выбрать все строки в одной таблице, которые не отображаются на другом?

Table1:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

Table2:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
+-----------+----------+------------+

Пример вывода для строк в таблице 1, которые не указаны в таблице 2:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

Возможно, что-то вроде этого должно работать:

SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)

Ответ 1

Если у вас есть 300 столбцов, как вы упомянули в другом комментарии, и вы хотите сравнить их во всех столбцах (при условии, что столбцы имеют одно и то же имя), вы можете использовать NATURAL LEFT JOIN для неявного объединения во всех именах совпадающих столбцов между две таблицы, так что вам не нужно утомительно печатать все условия соединения вручную:

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL

Ответ 2

Вам нужно сделать подзаголовок на основе имени столбца, а не *.

Например, если у вас есть поле id, общее для обеих таблиц, вы можете сделать:

SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)

Подробнее см. в синтаксисе подзапроса MySQL.

Ответ 3

Стандартный LEFT JOIN может решить проблему и , если поля в объединении индексируются,
также должен быть быстрее

SELECT *
FROM Table1 as t1 LEFT JOIN Table2 as t2 
ON t1.FirstName = t2.FirstName AND t1.LastName=t2.LastName
WHERE t2.BirthDate Is Null

Ответ 4

Select *
FROM Table1 as a
WHEre NOT EXISTS(Select *
FROM Table2 as b WHERE a.FirstName =b.FirstName and a.LastName=b.Last_Name )

Exists помогут вам...

Ответ 5

Try:

SELECT * FROM table1
    LEFT OUTER JOIN table2
    ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
    WHERE table2.BirthDate IS NULL

Ответ 6

Это работало для меня в Oracle:

SELECT a.* 
    FROM tbl1 a 
MINUS 
SELECT b.* 
    FROM tbl2 b;

Ответ 7

Попробуйте этот простой запрос. Он отлично работает.

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);

Ответ 8

SELECT a.* FROM 
FROM tbl_1 a
MINUS
SELECT b.* FROM 
FROM tbl_2 b