Je me trouve refusant d'appuyer sur l'utilisation de la jointure lorsque je peux facilement résoudre le même problème en utilisant une requête interne: p>
E.g. p>
Ma question est que c'est une mauvaise pratique de programmation? Je trouve plus facile de lire et de maintenir par opposition à une jointure. P>
Je veux ajouter qu'il y a de superbes commentaires ici qui, en substance, poussent à l'aide d'une jointure. Je me trouve moins et moins impliqué dans l'utilisation directe de TSQL directement ces jours-ci à partir du résultat des solutions ORM (LINQ à SQL SQL, NHibernate, etc.), mais lorsque je fais des choses comme des sous-requêtes corrélées que je trouve sont plus faciles à taper linéairement . P> Sélectionnez Colonne1, (Sélectionnez Colonne1 à partir de table2 où table2.id = Table1.table2Id) en tant que colonne2 de TABLE1; CODE> P> P>
8 Réponses :
Personnellement, je trouve cela incroyablement difficile à lire. Ce n'est pas la structure qu'un développeur SQL attend. En utilisant Join, vous gardez toutes vos sources de table dans une seule place au lieu de la diffuser dans votre requête. P>
Que se passe-t-il si vous avez besoin d'avoir trois ou quatre jointures? Mettre tous ceux-ci dans la clause Select va devenir velu. P>
"Le plan d'explication va être la même chose entre ces deux approches." - Dans cet exemple, cela peut être vrai (peut-être pas pour toutes les versions SQL Server), mais dès que la requête interne devient plus complexe, cela n'est souvent plus le cas. Au lieu de cela, le serveur traite une ligne après une autre au lieu de l'ensemble complet, qui est incroyablement lent pour les grands ensembles de données.
Une jointure est généralement plus rapide qu'une sous-requête corrélée, car elle agit sur l'ensemble des lignes plutôt que sur une ligne à la fois. Je ne laisserais jamais ce code aller sur mon serveur de production. P>
Et je trouve un joint beaucoup plus facile à lire et à entretenir. P>
Si vous avez besoin de plus d'une colonne de la deuxième table, vous auriez besoin de deux sous-candidats. Cela ne fonctionnerait généralement pas ainsi qu'un jointure. P>
Ce n'est pas une mauvaise pratique de programmation du tout imo, c'est un peu laide. Il peut en réalité être une performance de renforcement des performances dans des situations où la sous-sélection provient d'une très grande table pendant laquelle vous vous attendez à un très petit ensemble de résultats (vous devez envisager des index et de la plate-forme, 2000 ayant un optimiseur différent et tout à partir de 2005). Voici comment je le format pour être plus facile à lire. EDIT:
Cela suppose bien sûr que votre sous-sélection ne renvoyera qu'une valeur, sinon cela pourrait vous renvoyer de mauvais résultats. Voir la réponse de GBN. P> p>
Il en rend beaucoup plus facile d'utiliser d'autres types de jointures (extérieur gauche, croix, etc.), car la syntaxe de celles de sous-requête est inférieure à celle idéale pour la lisibilité p>
Ce n'est pas équivalent à rejoindre. P>
Si vous avez plusieurs rangées dans Table2 pour chaque ligne de Table1, vous ne les obtiendrez pas. Pour chaque ligne de Table1, vous obtenez une sortie d'une ligne afin que vous ne puissiez pas obtenir de multiples de table2. P>
C'est pourquoi j'utiliserais "Rejoindre": pour m'assurer que je reçois les données que je voulais ... p>
Après votre mise à jour: j'utilise rarement une corrélation sauf avec Exist ... P>
La requête que vous utilisez était souvent utilisée comme remplacement pour un Cette approche présente des inconvénients graves: P>
Il peut échouer si Certains moteurs ne seront pas en mesure d'utiliser autre chose que Si vous devez sélectionner plusieurs colonnes, vous devrez écrire la sous-requête plusieurs fois p> li>
ol>
Si votre moteur prend en charge dans Voir cet article dans mon blog pour les exemples: p>
Joindre de gauche code> pour les moteurs qui manquaient (le plus notamment, postgregesql code> avant 7.2 code >) p>
table2.id code> n'est pas unique code> p> l>
boucles imbriquées code> pour cette requête p> li>
rejoindre code>, utilisez le joindre rejoindre code>. p>
MySQL code> Cependant, il existe certains cas lorsqu'une fonction d'agrégation dans une sous-requête de niveau de sélection peut être plus efficace que celle dans un rejoindre code> avec un Groupe par code>. P>
À la fin de la journée, l'objectif lors de la rédaction de code, au-delà des exigences fonctionnelles, consiste à définir l'intention de votre code clair pour un lecteur. Si vous utilisez une jointure, l'intention est évidente. Si vous utilisez une sous-requête de la manière que vous décrivez, cela pose la question de savoir pourquoi vous l'avez fait de cette façon. Qu'essayiez-vous de réaliser qu'un jointure n'aurait pas accompli? En bref, vous gaspillez l'heure du lecteur en essayant de déterminer si l'auteur résolvait un problème de manière ingénieuse ou s'il écrivait le code après une nuit difficile de boire. P>
En raison de la performance et de la maintenabilité. Une fois que vous vous êtes habitué à
rejoindre code> s, vous ne reviendrez jamais.-1: sérieusement? Les avantages de la syntaxe de jointure ne sont pas évidents?
La nuit dernière, j'ai découvert qu'une requête interne ajoutait 1,7 seconde à une deuxième requête de 0,002.
@JIM: Ils pourraient ne pas être au début.
Est-ce une mauvaise pratique de programmation? code> oui b>Votre requête est efficacement toujours une jointure gauche et peut être pire que de rejoindre même si Table2 a toujours des enregistrements correspondants. Vous ne pouvez pas utiliser de valeurs renvoyées par la requête interne dans les clauses comme facilement.