Mysql: Selecione linhas de uma tabela que não estão em outra

Como selecionar todas as linhas em uma tabela que não aparecem em outra?

Tabela 1:

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

Mesa 2:

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

Exemplo de saída para linhas na Tabela 1 que não estão na Tabela 2:

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

Talvez algo assim deveria funcionar:

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

Se você tem 300 colunas como mencionou em outro comentário e deseja comparar em todas as colunas (supondo que as colunas tenham o mesmo nome), você pode usar um NATURAL LEFT JOIN para unir implicitamente em todos os nomes de colunas correspondentes entre as duas tabelas. para que você não precise digitar tediosamente todas as condições de junit manualmente:

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

Você precisa fazer a subseleção com base em um nome de coluna, não * .

Por exemplo, se você tivesse um campo de id comum a ambas as tabelas, você poderia fazer:

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

Consulte a syntax da subconsulta do MySQL para obter mais exemplos.

Um LEFT JOIN padrão poderia resolver o problema e, se os campos na junit forem indexados,
também deve ser mais rápido

 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 
 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 irá ajudá-lo …

Experimentar:

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

Isso funcionou para mim no Oracle:

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

Tente esta consulta simples. Funciona perfeitamente.

 select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2); 
 SELECT a.* FROM FROM tbl_1 a MINUS SELECT b.* FROM FROM tbl_2 b