2012-11-25 1 views
3

J'ai deux tables. VÉHICULES et PROPRIÉTÉ. J'essaie de faire une requête qui me donnera une liste de tous les véhicules PAS dans la table PROPRIÉTÉ. J'ai besoin fondamentalement d'un rapport de mon inventaire de VÉHICULE disponible. J'ai essayé cette requête:Multi Table NON EQUAL dans la requête d'accès

SELECT VEHICLE.* 
FROM VEHICLE, OWNERSHIP 
WHERE (VEHICLE.VEH_ID <> OWNERSHIP.VEH_ID); 

Im obtenir: enter image description here

Quand je fais autant que je reçois tous les véhicules qui sont répertoriés dans la propriété afin que les œuvres. Mais le NON égal ne fait pas. Des idées?

Répondre

2

Essayez

SELECT VEHICLE.* 
FROM VEHICLE 
WHERE NOT EXISTS 
(SELECT NULL FROM OWNERSHIP WHERE VEHICLE.VEH_ID= OWNERSHIP.VEH_ID); 
+0

Cela a fonctionné. Merci beaucoup. – Batman

+0

Im essayant d'apprendre ceci alors laissez-moi savoir si je l'explique mal s'il vous plaît. La sous-requête est de trouver quels véhicules sont à la fois dans le véhicule et la propriété. Attendu que la requête externe sélectionne tous les véhicules qui n'ont pas été identifiés comme appartenant à la fois au VÉHICULE et à la PROPRIÉTÉ. Est-ce correct? Serait-ce considéré comme une sous-requête corrélée? – Batman

+1

@Batman: Oui, c'est exact - une telle sous-requête peut être considérée comme corrélée. Cependant, cela ne signifie pas toujours de mauvaises performances, l'optimiseur est assez intelligent pour ne pas l'exécuter pour chaque ligne ... Je ne suis pas sûr à 100% que MS = Access supporte 'left join', mais la requête ci-dessus est la même comme 'SELECT v. * FROM véhicule v Propriété de LEFT JOIN o ON (o.veh_id = v.veh_id) WHERE o.veh_id IS NULL' et devrait générer le même plan d'exécution. – a1ex07

1

L'approche NOT EXISTS peut être lent si vos tables contiennent plusieurs lignes. Une approche alternative qui peut être beaucoup plus rapide consiste à utiliser un LEFT JOIN avec une clause WHERE pour renvoyer uniquement les lignes où le champ de jointure à droite est Null.

SELECT VEHICLE.* 
FROM 
    VEHICLE AS v 
    LEFT JOIN OWNERSHIP AS o 
    ON v.VEH_ID = o.VEH_ID 
WHERE o.VEH_ID Is Null; 

Vous pouvez utiliser Access' « Assistant Requête de non-correspondance » pour créer une requête similaire.

Si les deux tables sont petites, vous ne remarquerez probablement pas de différence. Mais il devrait être facile de vérifier si la différence est perceptible. Et cette approche vous servira mieux si vos tables se développent considérablement au fil du temps.