2010-06-06 1 views
1

J'ai les tables A, B, C, où A représente les éléments qui peuvent avoir zéro ou plusieurs sous-éléments stockés dans C. La table B a seulement 2 clés étrangères pour connecter A et C.Existe-t-il une autre manière d'écrire cette requête?

J'ai cette requête sql :

select * from A 
where not exists (select * from B natural join C where B.id = A.id and C.value > 10); 

qui dit: « Donnez-moi tous les articles de la table a, où tous les sous-éléments ont une valeur inférieure à 10.

y at-il un moyen d'optimiser cela et il est-il un moyen d'écrire cela? n'utilisant pas l'opérateur exists?

Répondre

1

Il existe trois façons couramment utilisées pour tester si une valeur est dans une table, mais pas un autre:

  • EXISTE PAS
  • PAS
  • GAUCHE REJOIGNEZ ... WHERE ... IS NULL

Vous avez déjà affiché le code pour le premier. Voici le second:

SELECT * 
FROM A 
WHERE id NOT IN (
    SELECT b.id 
    FROM B 
    NATURAL JOIN C 
    WHERE C.value > 10 
) 

Et avec une jointure gauche:

SELECT * 
FROM A 
LEFT JOIN (
    SELECT b.id 
    FROM B 
    NATURAL JOIN C 
    WHERE C.value > 10 
) BC 
ON A.id = BC.id 
WHERE BC.id IS NULL 

En fonction du type de base de données et la version, les trois méthodes différentes peuvent donner lieu à différents plans de requête avec des caractéristiques de performance.