2009-10-22 3 views
0

(pas discuter de la conception de la table, est un fait accompli!)sql pour revenir liste unique basé sur 2 tables de UserID

Je sais comment faire cette requête en utilisant WHERE NOT IN clause, mais je me demandais comment cela pourrait être fait en utilisant une jointure.

Note: les lignes ne sont pas uniques, donc nous devons faire un DISTINCT afin de ne pas avoir de doublons.

Users (userID) 
OldUsers(UserID) 

Donc, en utilisant la clause WHERE NOT IN que je peux faire:

SELECT DISTINCT(u.userID) 
FROM Users u 
WHERE u.userID NOT IN (SELECT o.userID FROM OldUsers o) 

Performance est une clé ici aussi.

+0

300 questions, 33% acceptent l'évaluation ... –

Répondre

3
select distinct u.userID from Users u 
left join OldUsers o on o.userId = u.userID 
where o.userId is null 
1

Vous pouvez également utiliser le mot-clé EXCEPT pour le faire de cette façon:

SELECT UserID FROM Users 
EXCEPT 
SELECT UserID FROM OldUsers 

En ce qui concerne la performance: vous aurez juste à exécuter les trois scripts (vous-même avec NOT IN, l'approche de Kragan avec LEFT JOIN et celui-ci avec EXCEPT) en comparaison et mesurez par vous-même quelle est la vitesse, combien de ressources ils utilisent etc. -> regardez les plans d'exécution, consultez les statistiques d'E/S - les choses habituelles ...

0

Vous pouvez également utiliser une sous-requête corrélée et EXISTS:

SELECT DISTINCT(u.userID) 
FROM Users u 
WHERE NOT EXISTS (
    SELECT o.userID 
    FROM OldUsers o 
    WHERE o.UserID = u.userID) 

Si cela est plus rapide dépend de la taille des tables, il est donc une autre version pour essayer comme marc_s a suggéré.

Questions connexes