2010-04-30 8 views
2

J'ai deux tables liées par une colonne ID. Appelons-les tableaux A et B. Mon but est de trouver tous les enregistrements dans le tableau A qui n'a pas pratiqué dans le tableau B. Par exemple:Alternative à NOT EXISTS

**Table A:** 
ID Value 
-- ------- 
1  value1 
2  value2 
3  value3 
4  value4 

**Table B** 
ID Value 
-- ------- 
1  x 
2  y 
4  z 
4  l 

Comme vous pouvez le voir, avec enregistrement ID = 3 ne existe dans la table B, donc je veux une requête qui me donnera l'enregistrement 3 de la table A. La façon dont je fais actuellement ceci est en disant AND NOT EXISTS (SELECT ID FROM TableB where TableB.ID = TableA.ID), mais depuis les tables sont énormes, la performance sur ce point est terrible. En outre, lorsque j'ai essayé d'utiliser une jointure à gauche où TableB.ID est null, cela n'a pas fonctionné. Quelqu'un peut-il suggérer une alternative?

+1

Voulez-vous dire, ET N'EXISTE PAS (SELECT ID FROM TABLE B WHERE ID = tbla.ID)? – Nitrodist

+0

@nitro oui je l'ai fait, merci pour la correction – TerrorAustralis

+0

@sam, lisez la dernière phrase, déjà essayé – TerrorAustralis

Répondre

4

Essayez Not IN

AND tablea.id NOT In (SELECT ID FROM TableB) 

contrôle plus http://www.java2s.com/Code/SQLServer/Select-Query/NOTIN.htm

+0

merci :) optimiseur vous aime – TerrorAustralis

+0

Mieux espérer que la colonne ID n'a jamais une valeur NULL dedans sur TableB. Notez que NOT IN et NOT EXISTS, si les deux colonnes sont 'NOT NULL', devraient être * équivalent * dans le serveur SQL. Pour plus d'informations, voir ici: http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ –

0
SELECT ID 
    FROM Table_A 
EXCEPT 
SELECT ID 
    FROM Table_B; 
1

Vous pouvez le remplacer par

SELECT 
    a.ID, 
    a.Value 
FROM Table_A AS a 
LEFT JOIN Table_B AS b ON a.ID = b.ID  
WHERE b.ID IS NULL 

Cette solution devrait être plus efficace que IN() et EXISTS() alternatives. Source here