Quelle est la différence entre ces deux requêtes comme l'obtention de deux autre ensemble de résultats?
Je reçois un autre ensemble de résultats pour ces deux requêtes et le deuxième ensemble de résultats semble être correct. Quelle est la différence dans ces requêtes.
Ce type de requête de jointure interne seconde est?
1)
FROM TABLE1 t1
INNER JOIN TABLE2 t2 ON t1.Id = t2.Id
WHERE
t1.StatusId = 12
2)
FROM TABLE1 t1
INNER JOIN TABLE2 t2 ON t1.Id = t2.Id
AND t1.StatusId = 12
plsql est pour oracle. Je pense que vous vouliez dire, tsql.
Tout le monde veut voir vos résultats. Pouvez-vous ajouter à votre question?
Est-ce une simplification de la requête vous sont effectivement en cours d'exécution? Parfois, ce n'est pas ce que vous pensez est à l'origine du problème qui est à l'origine du problème. Veuillez poster le réel de requête si vous avez simplifié. Ces deux requêtes doivent être équivalentes.
Je pense que le code n'a fait une apparition si vous regardez l'historique d'édition. @dave - Avez-vous repérer le problème avec elle après la publication?
Tout le monde veut voir vos résultats. Pouvez-vous ajouter à votre question?
Est-ce une simplification de la requête vous sont effectivement en cours d'exécution? Parfois, ce n'est pas ce que vous pensez est à l'origine du problème qui est à l'origine du problème. Veuillez poster le réel de requête si vous avez simplifié. Ces deux requêtes doivent être équivalentes.
Je pense que le code n'a fait une apparition si vous regardez l'historique d'édition. @dave - Avez-vous repérer le problème avec elle après la publication?
OriginalL'auteur Dave | 2010-10-13
Vous devez vous connecter pour publier un commentaire.
Il fait vraiment aucune différence lorsque vous faites cela dans la JOINTURE INTERNE.
Toutefois, lorsque vous utilisez les boutons GAUCHE ou DROIT de la REJOINDRE, il ne faire une différence, si vous mettez le filtre supplémentaire dans la JOINTURE ou dans la clause where.
Lorsque vous mettez le filtre dans la clause where SQL Server effectue la jointure, puis complètement filtre les lignes où le filtre ne correspond pas.
--> cela permettra de réduire le nombre de lignes qui sont retournés
Lorsque vous mettez le filtre dans la JOINTURE, SQL Server ne le filtrage lors de la rejoindre, mais seulement sur la table où vous mettez le filtre.
Vous obtenez toujours toutes les lignes dans les autres tables, mais seulement ceux qui ont les données de la table filtrée où le filtre s'adapte.
--> ce ne sera pas de réduire le nombre de lignes, mais les colonnes avec des données de la filteres tableau sera vide en plus de lignes
C'est difficile à expliquer...pour le rendre plus clair, voici un exemple:
Prendre l'exemple de données de RedFilter réponse:
...et d'exécuter les requêtes suivantes:
Note les différents résultats, comme indiqué dans les commentaires.
OriginalL'auteur Christian Specht
Ces requêtes doivent être de retour des résultats identiques. Merci de poster l'compléter les requêtes.
Ci-dessous est un exemple montrant la même sortie de deux variantes:
Exemple:
De sortie:
C'est incorrect. Pour un
INNER JOIN
, les résultats sont identiques que vous filtre dans leWHERE
clause ouON
clause.D'accord. La différence pour les jointures externes, mais ne devrait pas question pour l'intérieur.
Pourquoi le downvote? Voter avec des faits, pas des hypothèses 🙂
J'ai mis à jour ma réponse auprès d'un échantillon de cas.
OriginalL'auteur RedFilter
En regardant l'historique d'édition de la question, il semble que vos requêtes sont le long des lignes suivantes.
Requête De L'Une
Requête De Deux
La différence entre eux est que la Requête de l'Un convertit efficacement les
LEFT
se Joindre à unINNER
Rejoindre.Pour une jointure externe gauche, conceptuellement, la suite se passe.
Aucun de ces lignes d'un ajout à l'étape 2 permettra de répondre à la
T3.col = somevalue
prédicat à l'étape 3 comme nous savons que la valeur de cette colonne pour l'ensemble de ces lignes estNULL
.OriginalL'auteur Martin Smith
SQL est un langage déclaratif, et c'est le SGBD pour mettre en œuvre votre requête. L'optimiseur de requête SQL Server ne se soucient pas si vous intérieure-joindre deux tables à l'aide d'un
JOIN
expression, unWHERE
expression, unIN
expression ou unEXISTS
expression, en interne, ils sont tous traités de la même façon. SQL Server dispose de 3 différents algorithmes de jointure, qui sont sélectionnés uniquement sur la base du nombre de lignes et de distribution de données, pas la syntaxe exacte utilisée pour déclarer leur. Si vous comparez les plans d'exécution des deux requêtes dans votre exemple, vous devriez trouver qu'ils sont identiques, et donc de produire le même jeu de résultats.OriginalL'auteur Christian Hayter
La différence sous le capot, c'est que la clause where est accessible après toutes les jointures.
Cela signifie que peut-être, dans ce cas, il n'y a pas de différence, mais cela ne serait pas toujours vrai quand il y a plusieurs jointures. Ils pourraient être pris en compte de l'virtuel jeux de résultats (selon les circonstances) avant le OÙ est traitée.
De bien vouloir voir ce lien: http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/
OriginalL'auteur Mike Cheel
Je crois que c'est comme ceci:
La première requête obtient tous les résultats de la tables jointes et les filtres sur la clause where.
La deuxième requête obtient les résultats du tableau 1, où le StatusID = 12 et effectue ensuite la rejoindre sur le jeu de résultats.
C'est une différence subtile.
Edit:
Voici un lien vers un article de la vérification de la différence:
http://www.sqlteam.com/article/additional-criteria-in-the-join-clause
Oui, mais la question est pourquoi ne sont-ils pas les mêmes résultats. Ils apparaissent à l'œil nu, à la demande de la même information, et je suppose de les regarder qu'ils allaient générer le même plan d'exécution.
-1: Croire n'est pas suffisant dans ce cas - s'il vous plaît fournir un échantillon de cas d'utilisation preuve de la différence en sortie.
-1. J'ai testé plusieurs tables, et les plans d'exécution sont identiques, indépendamment de l'utilisation de
WHERE t1.StatusId = 12
ou l'ajout deAND t1.StatusId = 12
dans le cadre de la jointure. SQL doit être assez intelligent pour comprendre les plans d'exécution basé sur la requête.De l'article que vous avez lié à: "Notez qu'il n'y a pas de différence dans les jeux de résultats si on utilise une jointure interne au lieu d'une jointure externe, car la jointure interne supprime la non-correspondance des enregistrements, peu importe."
OriginalL'auteur Leslie