Welcome to Our Website

conseil SQL: jointures de gauche et où les clauses are sont-elles vraiment jointures de gauche?

X

vie privée & Cookies

Ce site utilise des cookies. En continuant, vous acceptez leur utilisation. En savoir plus, y compris comment contrôler les cookies.

compris!,

Annonces

Il y a des moments où je l’examen des requêtes SQL et de trouver des gens à l’aide de Jointures EXTERNES gauches mais ensuite utiliser les clauses where qui les rejoint dans Jointures internes. Récemment comme je l’ai mentionné à quelqu’un ils m’ont rappelé que je devrais bloguer sur it…so ici, je blogue à ce sujet. First

Tout d’abord, si vous n’êtes pas familier avec les différentes jointures, allez-y et lisez cette autre astuce SQL que j’ai écrite., Maintenant, apprenons un peu plus sur la jointure externe gauche (je vais me référer simplement à la jointure gauche à partir de Maintenant).

commençons par quelques exemples de données. Ce qui suit peut être utilisé au début de vos propres requêtes si vous allez exécuter ces tests pour vous-même. Comme vous pouvez le voir, il crée deux tables (variables de table).,

Si nous voulons retourner tous les enregistrements dans « Table1” indépendamment du fait qu’il y ait un enregistrement associé dans « Table2” et afficher les données de « Table2” quand il y a un enregistrement associé, nous écririons une jointure gauche, comme ceci:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID;

Sortie:

cependant, si nous voulons maintenant ajouter une clause WHERE à la requête pour id est inférieur à 4 nous pourrions faire quelque chose comme ceci:

sortie:

mais did avez-vous vu que nous n’obtenons que les valeurs où il y a un ID correspondant dans les deux tables?, Hmmm that cela semble agir énormément comme une jointure intérieure, non? C’est parce qu’il est. Ne me croyez pas? Jetez un œil au plan d’exécution après avoir exécuté la jointure gauche avec et sans la condition WHERE. Voici ce que vous verrez:

alors, comment pouvons-nous contourner cela? Eh bien, puisque vous faites une jointure gauche pour commencer, vous avez évidemment besoin ou souhaitez renvoyer tous les enregistrements de « Table1” quelles que soient les données de « Table2”., Et si vous ne voulez vraiment pas retourner des données pour certains enregistrements dans « Table2 », vous pouvez filtrer ces enregistrements dans votre prédicat de jointure (les « critères de recherche » dans la partie ON de la jointure). Par exemple, la dernière requête serait écrite comme ceci à la place:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID AND tb2.columnID < 4;

sortie:

voyez comment nous obtenons toujours les 5 enregistrements de « Table1” mais pas les données de « Table2” qui ne répondaient pas à nos critères? Il renvoie simplement des valeurs nulles pour les données de cette table qui ne répondent pas aux critères. Assez impressionnant à droite?,

et we nous pouvons regarder à nouveau le plan d’exécution pour prouver que nous utilisons réellement une jointure gauche:

qu’en est-il quand, au lieu d’une valeur, quelqu’un utilise la condition is NULL à la place? Eh bien, dans ce cas vous pouvez l’utiliser dans la clause where.

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID IS NULL;

Résultat:

Et, regardons le plan d’exécution de nouveau:

Notez qu’il effectue la jointure gauche, puis filtre les données pour les enregistrements NULL? C’est ce que nous voulons faire et franchement, c’est ce que nous avons probablement attendre.

et si nous utilisons IS NOT NULL à la place? Eh bien…c’est une autre histoire., Je vais gâcher la surprise et juste vous dire qu’il fera une jointure interne comme il le ferait avec une valeur réelle. Si vous ne me croyez pas, lancez la requête vous-même et regardez le plan d’exécution.

donc, vous l’avez; c’est ainsi qu’une jointure gauche peut ou non être une jointure gauche. Espérons que ces informations vous aideront à mieux écrire, ou du moins, des requêtes plus éclairées.

Annonces

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *