web-dev-qa-db-fra.com

Mysql: sélectionne des lignes d'une table qui ne sont pas dans une autre

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)
102
user1006989

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
86
Zane Bien

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.

164
Stennie
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 ...

34
Ruzbeh Irani

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
31
Steve

Essayer:

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

Essayez cette requête simple. Ça fonctionne parfaitement.

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

Cela a fonctionné pour moi dans Oracle:

SELECT a.* 
    FROM tbl1 a 
MINUS 
SELECT b.* 
    FROM tbl2 b;
0
Gennady Sorochan