Comment sélectionner toutes les lignes d'une table qui n'apparaissent pas sur une autre?
Tableau 1:
+-----------+----------+------------+
| FirstName | LastName | BirthDate |
+-----------+----------+------------+
| Tia | Carrera | 1975-09-18 |
| Nikki | Taylor | 1972-03-04 |
| Yamila | Diaz | 1972-03-04 |
+-----------+----------+------------+
Tableau 2:
+-----------+----------+------------+
| FirstName | LastName | BirthDate |
+-----------+----------+------------+
| Tia | Carrera | 1975-09-18 |
| Nikki | Taylor | 1972-03-04 |
+-----------+----------+------------+
Exemple de sortie pour les lignes de Table1 qui ne sont pas dans Table2:
+-----------+----------+------------+
| FirstName | LastName | BirthDate |
+-----------+----------+------------+
| Yamila | Diaz | 1972-03-04 |
+-----------+----------+------------+
Peut-être que quelque chose comme ça devrait marcher:
SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)
Si vous avez 300 colonnes, comme vous l'avez mentionné dans un autre commentaire, et que vous souhaitez comparer toutes les colonnes (en supposant que les colonnes portent le même nom), vous pouvez utiliser un NATURAL LEFT JOIN
pour joindre implicitement tous les noms de colonnes correspondants. deux tables afin que vous n'ayez pas à taper fastidieusement toutes les conditions de jointure manuellement:
SELECT a.*
FROM tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE b.FirstName IS NULL
Vous devez faire la sous-sélection basée sur un nom de colonne et non sur *
.
Par exemple, si vous aviez un champ id
commun aux deux tables, vous pourriez faire:
SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)
Reportez-vous à la syntaxe de sous-requête MySQL pour plus d'exemples.
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
vous aidera ...
Une jointure standard à gauche pourrait résoudre le problème et, si les champs de la jointure sont indexés,
devrait aussi être plus rapide
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
Essayer:
SELECT * FROM table1
LEFT OUTER JOIN table2
ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
WHERE table2.BirthDate IS NULL
Essayez cette requête simple. Ça fonctionne parfaitement.
select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
Cela a fonctionné pour moi dans Oracle:
SELECT a.*
FROM tbl1 a
MINUS
SELECT b.*
FROM tbl2 b;