exclus J'ai une instruction SELECT qui fonctionne, et fonctionne assez vite sur mes tables (< 0.01sec sur 50k + produits, 3k + catégories). Mais dans mon esprit, ce n'est pas très élégant et j'aimerais entendre des suggestions pour l'améliorer.SQL: Sélectionnez les enregistrements appartenant à la catégorie exclus qui appartiennent uniquement à la catégorie
Il y a 3 tables d'intérêt:
- produits - ProductID clés
- catégories - clés categoryID
- products_tree - table de liens (catégories contiennent de nombreux produits, les produits peuvent appartenir à plusieurs catégories)
J'ai une liste des categoryIDs exclus [par exemple 1040,1050,1168] Je veux sélectionner tous les productIDs qui appartiennent à l'une de ces catégories exclues que si le produit ne fait pas partie à une autre catégorie non exclus
Ma requête ressemble à ceci:
SELECT DISTINCT productID
FROM products_tree
WHERE
categoryID IN (1040,1050,1168)
AND productID NOT IN
(SELECT DISTINCT productID
FROM products_tree
WHERE
categoryID NOT IN (1040,1050,1168)
);
ProductID et CategoryID sont primaires sur leurs tables respectives, et sont INDEX sur la table des liens. J'ai changé DISTINCT en GROUP BY et j'ai obtenu la même performance. Je suppose que l'optimiseur remarquait cela. Le SQL que vous avez suggéré académiquement intéressant, j'ai accepté cette réponse. – rwired
L'une des suggestions a-t-elle donné l'exemple que vous avez donné? Mon attente est que (dans MSSQLServer) en utilisant "NOT EXISTS" dans la clause where devrait être le plus rapide. (Utiliser 'segmentation' pour améliorer l'efficacité de la requête.) – MatBailie