1
votes

Joindre à gauche EXCLUANT les enregistrements correspondants?

La jointure gauche traditionnelle renvoie tous les enregistrements de la table de gauche, y compris les enregistrements correspondants:

entrez la description de l'image ici

Je souhaite utiliser la jointure vers exclure les enregistrements correspondants et ne renvoie que les enregistrements non correspondants de la table de gauche:

 entrez la description de l'image ici p >

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 ;


1 commentaires

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.


3 Réponses :


6
votes

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.


0 commentaires

1
votes

Utilisez Except pour interpréter

   Select * from table t LEFT JOIN 
     TABLE1 t1
   On t.id=t1.id
   Except
 SELECT * FROM TABLE1


8 commentaires

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.



1
votes

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


0 commentaires