tablas - Mysql: selecciona filas de una tabla que no están en otro
optimizar consultas lentas mysql (8)
¿Cómo seleccionar todas las filas en una tabla que no aparecen en otra?
Tabla 1:
+-----------+----------+------------+
| FirstName | LastName | BirthDate |
+-----------+----------+------------+
| Tia | Carrera | 1975-09-18 |
| Nikki | Taylor | 1972-03-04 |
| Yamila | Diaz | 1972-03-04 |
+-----------+----------+------------+
Tabla 2:
+-----------+----------+------------+
| FirstName | LastName | BirthDate |
+-----------+----------+------------+
| Tia | Carrera | 1975-09-18 |
| Nikki | Taylor | 1972-03-04 |
+-----------+----------+------------+
Ejemplo de salida para las filas en la Tabla 1 que no están en la Tabla 2:
+-----------+----------+------------+
| FirstName | LastName | BirthDate |
+-----------+----------+------------+
| Yamila | Diaz | 1972-03-04 |
+-----------+----------+------------+
Tal vez algo así debería funcionar:
SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)
Debe hacer la subselección basada en un nombre de columna, no *
.
Por ejemplo, si tuviera un campo de id
Común a ambas tablas, podría hacer:
SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)
Consulte la sintaxis de subconsulta de MySQL para más ejemplos.
Esto funcionó para mí en Oracle:
SELECT a.*
FROM tbl1 a
MINUS
SELECT b.*
FROM tbl2 b;
Prueba esta simple consulta. Funciona perfectamente
select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
Si tiene 300 columnas como mencionó en otro comentario y desea comparar todas las columnas (suponiendo que todas las columnas tengan el mismo nombre), puede usar una NATURAL LEFT JOIN
para unir implícitamente todos los nombres de columna coincidentes entre las dos tablas para que no tenga que escribir tediosamente todas las condiciones de unión manualmente:
SELECT a.*
FROM tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE b.FirstName IS NULL
Tratar:
SELECT * FROM table1
LEFT OUTER JOIN table2
ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
WHERE table2.BirthDate IS NULL
Un LEFT JOIN estándar podría resolver el problema y, si los campos de join están indexados,
también debería ser más 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
te ayudará ...
SELECT a.* FROM
FROM tbl_1 a
MINUS
SELECT b.* FROM
FROM tbl_2 b