2009-07-29 7 views
0

J'ai deux listes d'identifiants. Liste A et liste B. Ces deux listes sont en réalité les résultats de requêtes SQL (QUERY A et QUERY B respectivement).Quel est le moyen le plus efficace d'écrire cette requête SQL?

Je veux 'filtre' Liste A, en supprimant les ids dans la liste A si elles apparaissent dans la liste B.

Ainsi, par exemple, si la liste A ressemble à ceci:

1, 2, 3 , 4, 7

et la liste B ressemble à ceci:

2,7

alors la 'filtrée' la liste A doit avoir ids 2 et 7 enlevés, et devrait donc ressembler à ceci:

1, 3, 4

Je veux écrire une requête SQL comme celui-ci (pseudo code de cours):

id SELECT FROM (QUERYA) comme temporary_table où id pas (QUERYB)

Répondre

1

la requête:

select id 
from ListA 
where id not in (
    select id 
    from ListB) 

vous donnera la résultat désiré.

3

Utilisation de SQL classique:

select [distinct] number 
from list_a 
where number not in (
    select distinct number from list_b 
); 

J'ai mis la première "distinct" entre crochets car je ne suis pas sûr de savoir si vous vouliez les doublons supprimés (soit supprimer les crochets ou le mot entier). Le second "distinct" doit être laissé juste au cas où votre SGBD n'optimiserait pas les clauses IN.

Il peut être plus rapide (mesure, ne pense pas) avec une jointure gauche le long des lignes de:

select [distinct] list_a.number from list_a 
left join list_b on list_a.number = list_b.number 
where list_b.number is null; 

affaire avec le même "[distinct]".

+0

Je pense que dans votre deuxième requête, vous vouliez utiliser une jointure OUTER gauche –

+0

Désolé, ignorez mon commentaire précédent - ce n'est pas pertinent. –

1

Je ne sais pas quelle est la meilleure solution. Comme mon impression précédente, la perforamnce pourrait être très différente dépend de la situtation et de la taille des tables.

1.

select id 
from ListA 
where id not in (
    select id 
    from ListB) 

2.

select ListA.id 
from ListA 
left join ListB on ListA.id=ListB.id 
where ListB.id is null 

3.

select id 
from ListA 
where not exists (
    select * 
    from ListB where ListB.id=ListA.id) 

Le 2) devrait être le plus rapide en général, comme il le fait jointure interne pas sous-requêtes.

Certaines personnes peuvent suggérer 3) plutôt que 1) parce qu'elle utilise "existe" qui ne lit pas les données de la table.

Questions connexes