Magazine High tech

Différence entre l'opérateur INTERSECT et INNER JOIN sous SQL Serveur 2005

Publié le 07 août 2008 par Dave Lizotte

Nous allons ici, éclaircir un peu la notion de INTERSECT et de INNER JOIN sous SQL Serveur 2005 car selon plusieurs courriels que j'ai reçu, certain on de la difficulté à différencier les 2 méthodes.

INTERSECT

L'opérateur INTERSECT de SQL Serveur 2005 est utilisé afin de récupérer les lignes communes de 2 tables. La plupart du temps, l'opérateur retourne le même résultat qu'avec un INNER JOIN. Lors de l'utilisation de l'opérateur, il faut que le nombre de champs de chaque requête soit le même et dans le même ordre. Il faut aussi que les types de champs soit les mêmes à des fins de compatibilité. Voici un exemple :

Exemple :

SELECT * FROM HumanResources.EmployeeDepartmentHistory
WHERE EmployeeID IN (1,2,3)
INTERSECT
SELECT * FROM HumanResources.EmployeeDepartmentHistory
WHERE EmployeeID IN (3,2,5)

Résultat :

Le résultat affiche chaque EmployeeID qui se trouve dans les 2 requêtes.

INNER JOIN

Exemple :

SELECT va.VendorID,va.ModifiedDate FROM Purchasing.VendorContact vc
INNER JOIN Purchasing.VendorAddress va ON vc.VendorID = va.VendorID
AND vc.ModifiedDate = va.ModifiedDate

Résultat :

Le résultat affiche toutes les lignes qui sont présent dans les 2 tables. Par contre, cette requête affiche toute les lignes qui sont dans la première table et aussi toutes celles qui sont dans la seconde. Donc si vous observez, vous remarquerez que plusieurs lignes sont en double ce qui ne se produit pas avec l'opérateur INTERSECT.

INNER JOIN avec DISTINCT

Exemple :

SELECT DISTINCT va.VendorID,va.ModifiedDate FROM Purchasing.VendorContact vc
INNER JOIN Purchasing.VendorAddress va ON vc.VendorID = va.VendorID
AND vc.ModifiedDate = va.ModifiedDate

Résultat :

Le résultat affiche la même chose qu'avec l'opérateur INTERSECT. C'est donc dire, qu'il est possible de simuler l'opérateur INTERSECT depuis l'opérateur INNER JOIN. Par contre, cette méthode entraîne une légère perte de performance. Donc si vous pouvez, il est préférable d'utiliser l'opérateur INTERSECT, dans les autres cas, utiliser l'opérateur DISCINCT dans vos jointures.



Ajouter cette page à votre Digg-Like préféré
Reddit!
Del.icio.us!
JoomlaVote!
Google!
Live!
Facebook!
Technorati!
StumbleUpon!
Spurl!
Furl!
Blogmarks!
Yahoo!
FeedMeLinks!
&<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><&><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>&<><>&<><><><><><><><><><><><><><><><><>&<><><><><><><><><><><>
busy

Retour à La Une de Logo Paperblog

A propos de l’auteur


Dave Lizotte 57 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte