Réponses:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q : Que se passe-t-il ici?
R : Conceptuellement, nous sélectionnons toutes les lignes table1
et pour chaque ligne, nous essayons de trouver une ligne table2
avec la même valeur pour la name
colonne. S'il n'y a pas une telle ligne, nous laissons simplement la table2
partie de notre résultat vide pour cette ligne. Ensuite, nous contraignons notre sélection en ne sélectionnant que les lignes du résultat où la ligne correspondante n'existe pas. Enfin, nous ignorons tous les champs de notre résultat, à l'exception de la name
colonne (celle dont nous sommes sûrs qu'elle existe table1
).
Bien que ce ne soit pas la méthode la plus performante possible dans tous les cas, elle devrait fonctionner dans pratiquement tous les moteurs de base de données qui tentent d'implémenter ANSI 92 SQL
Vous pouvez soit faire
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
ou
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Voir cette question pour 3 techniques pour accomplir cela
Je n'ai pas assez de points de rep pour voter sur la 2e réponse. Mais je ne suis pas d'accord avec les commentaires sur la première réponse. La deuxième réponse:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Est FAR plus efficace dans la pratique. Je ne sais pas pourquoi, mais je le lance contre 800k + records et la différence est énorme avec l'avantage donné à la 2ème réponse affichée ci-dessus. Juste mon 0,02 $
Il s'agit d'une pure théorie des ensembles que vous pouvez réaliser avec l' minus
opération.
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Attention aux pièges. Si le champ Name
en Table1
contient des valeurs NULL vous de surprises. Mieux vaut:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Voici ce qui a fonctionné le mieux pour moi.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
C'était plus de deux fois plus rapide que toute autre méthode que j'ai essayée.
Vous pouvez les utiliser EXCEPT
en mssql ou MINUS
en oracle, ils sont identiques selon:
Ce travail est net pour moi
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Voir requête:
SELECT * FROM Table1 WHERE
id NOT IN (SELECT
e.id
FROM
Table1 e
INNER JOIN
Table2 s ON e.id = s.id);
Conceptuellement, ce serait: récupérer les enregistrements correspondants dans la sous-requête, puis dans la requête principale, récupérer les enregistrements qui ne sont pas dans la sous-requête.
Je vais republier (car je ne suis pas encore assez cool pour commenter) dans la bonne réponse ... au cas où quelqu'un d'autre aurait pensé qu'il fallait mieux l'expliquer.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
Et j'ai vu la syntaxe dans FROM nécessitant des virgules entre les noms de table dans mySQL mais dans sqlLite, il semblait préférer l'espace.
En fin de compte, lorsque vous utilisez des noms de variable incorrects, cela laisse des questions. Mes variables devraient avoir plus de sens. Et quelqu'un devrait expliquer pourquoi nous avons besoin d'une virgule ou pas de virgule.
Si vous souhaitez sélectionner un utilisateur spécifique
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
La tent_npk
est une clé primaire d'un utilisateur