La jointure gauche traditionnelle renvoie tous les enregistrements de la table de gauche, y compris les enregistrements correspondants:
Je souhaite utiliser la jointure vers exclure les enregistrements correspondants et ne renvoie que les enregistrements non correspondants de la table de gauche:
Ci-dessous, le code que j'ai trouvé jusqu'à présent.
Il utilise une clause WHERE
pour éliminer les enregistrements correspondants - mais cela semble mal d'une manière ou d'une autre.
Est-ce la meilleure façon de procéder? Ou existe-t-il une meilleure méthode de participation exclusive?
SELECT L.col1 , L.col2 , FROM leftTable L LEFT JOIN rightTable R ON R.col1 = L.col1 WHERE R.id IS NULL ;
3 Réponses :
La méthode LEFT JOIN
convient. Il est optimisé dans de nombreuses bases de données. Personnellement, je préfère NOT EXISTS
, car je pense que c'est plus concis:
SELECT L.col1, L.col2 FROM leftTable L WHERE NOT EXISTS (SELECT 1 FROM rightTable R WHERE R.col1 = L.col1);
Autrement dit, la logique est en un seul endroit (le NOT EXISTS expression) plutôt que d'être répartie sur deux clauses de requête.
Utilisez Except
pour interpréter
Select * from table t LEFT JOIN TABLE1 t1 On t.id=t1.id Except SELECT * FROM TABLE1
MINUS
n'est pas un mot clé dans SQL Server. Vous pensez peut-être à SAUF
.
C'est un opérateur pour référence techonthenet.com/sql/minus.php
" MINUS
n'est pas un mot clé dans SQL SERVER " : db <> FIddle : Msg 102 Niveau 15 État 1 Ligne 3 Syntaxe incorrecte près de 'MINUS'.
Cela ne veut pas dire que ce n'est pas le cas un opérateur dans d'autres dialectes SQL, cependant, ce n'est pas un opérateur dans T-SQL.
En fait, le lien auquel vous faites référence confirme même ceci: " CONSEIL: L'opérateur MINUS n'est pas pris en charge dans toutes les bases de données SQL. Il peut être utilisé dans des bases de données telles qu'Oracle. Pour les bases de données telles que SQL Server, PostgreSQL et SQLite, utilisez l ' opérateur EXCEPT pour effectuer ce type de requête. "< / i> L'OP a marqué SQL Server ici, pas Oracle.
ohhh .. je pensais que son oracle. Merci.
Non, l'OP n'a pas du tout marqué Oracle ici.
Mon mauvais sauf
fonctionnerait alors mais la logique était la même. Le changera en Sauf
EXCEPT
ne fait pas exactement la même chose, car il supprime les doublons. Cela pourrait être souhaitable, mais ce n'est pas équivalent.
Il n'y a rien de mal à utiliser l'approche de jointure à gauche en fait c'est une approche standard et la plupart des gens suivent cette méthode pour exclure des enregistrements et des insertions incrémentielles dans certains cas
Ceci est une FAQ. Avant d'envisager de publier, veuillez toujours rechercher sur Google votre message d'erreur ou de nombreuses phrases claires, concises et précises de votre question / problème / objectif, avec et sans vos chaînes / noms et site particuliers: stackoverflow.com & tags, et lire de nombreuses réponses. Si vous postez une question, utilisez un seul libellé comme titre. Voir Comment demander et les textes de la flèche de vote. PS "la jointure à gauche renvoie tous les enregistrements de la table de gauche" C'est une formulation médiocre, mais typique - car la jointure à gauche renvoie des lignes avec les colonnes des deux entrées. Vous essayez de dire quelque chose impliquant que les lignes d'entrée de gauche sont des sous-lignes de lignes renvoyées.