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