Requête SQL: relation de key étrangère auto-référencée

J'ai deux tables, tabSparePart et tabSparePartCategory . Chaque pièce de rechange appartient à une catégorie de pièces de rechange. J'ai besoin de toutes les pièces détachées appartenant à une catégorie spécifique. Mais le problème est qu'une catégorie de pièces de rechange pourrait être une "sous-catégorie" d'une autre, elles se referencent mutuellement (les "catégories principales" ont "nul" dans cette colonne FK).

Disons que j'ai besoin de toutes les pièces de rechange avec fiSparePartCategory=1 et toutes les pièces de rechange qui appartiennent à une catégorie qui est une "sous-catégorie" de category=1 .

Comment écrire la requête SQL qui renvoie toutes les pièces de rechange, quel que soit le nombre de niveaux de sous-catégories. J'espère que vous comprenez mes exigences.

Ce qui suit est une illustration de ce que j'ai. Comment le rendre dynamic pour qu'il fonctionne quel que soit le nombre de sous-catégories?

Merci, Tim

texte alt

Lien vers l'image: http://www.bilder-hochladen.net/files/4709-lg-jpg.html

EDIT : Voici une autre approche statique qui fonctionne lorsqu'il n'y a qu'un seul niveau de sous-catégorie:

 SELECT SparePartName FROM tabSparePart WHERE (fiSparePartCategory IN (SELECT idSparePartCategory FROM tabSparePartCategory WHERE (idSparePartCategory = 1) OR (fiSparePartCategory = 1))) 

    Vous pouvez utiliser une expression de table commune récursive pour cela.

    Dans votre cas, vous devez get tous les identifiants de catégorie de pièce de rechange pour un identifiant de catégorie principale spécifique et le joindre aux pièces de rechange. Quelque chose comme ça:

     WITH SparePartCategories(CategoryId) AS ( SELECT c.idSparePartCategory FROM tabSparePartCategory c WHERE c.idSparePartCategory = 1 UNION ALL SELECT c.idSparePartCategory FROM tabSparePartCategory c JOIN SparePartCategories parent ON c.fiSparePartCategory = parent.CategoryId ) SELECT sp.SparePartName FROM tabSparePart sp JOIN SparePartCategories spc ON sp.fiSparePartCategory = spc.CategoryId