2010-06-25 8 views
2

Espérons que le titre soit suffisamment clair! Je suis à la recherche d'une seule requête qui reproduit la fonctionnalité de la suivante, mais sans utiliser une sous-requête:Requête SQL unique pour trouver des lignes où une valeur est présente pour une clé mais pas une autre donnée

select p_id from a_p 
where a_id=1 
    and p_id not in (select p_id from a_p where a_id=2) 

Par exemple, table a_p a les lignes suivantes:

a_id | p_id 
1 | 1 
1 | 2 
2 | 2 

Ici, p_id 1 est présent pour a_id 1 mais pas a_id 2 - la requête ci-dessus ne retournera que p_id 1. Des idées?

+2

Pourquoi l'exigence de ne pas utiliser une sous-requête? Vous êtes en train de vous menotter avec celui-là. – Toby

+2

@Toby: idées fausses sur ce que sont les sous-requêtes et comment l'optimiseur les traite ... –

Répondre

1

Sans être en mesure d'utiliser un sous-requête, qui vous laisse avec l'aide LEFT OUTER JOIN/IS NULL:

SELECT a.p_id 
    FROM A_P a 
LEFT JOIN A_P b ON b.p_id = a.p_id 
       AND b.a_id = 2 
    WHERE a.a_id = 1 
     AND b.p_id IS NULL 

Soyez conscients que les performances ne sont pas sous_requête les mêmes pour tous les fournisseurs de bases de données. Dans PostgreSQL et Oracle, NOT IN, NOT EXISTS et LEFT JOIN/IS NULL sont tous équivalents. Seulement en MySQL est LEFT JOIN/IS NULL plus efficace.

+0

Merci, c'est génial! – user376511

Questions connexes