2010-09-16 3 views
3

У меня есть две таблицы, tabSparePart и tabSparePartCategory. Каждая запасная часть относится к категории запасных частей. Мне нужны все запасные части, относящиеся к определенной категории. Но проблема в том, что категория запасных частей может быть «подкатегорией» другой, они ссылаются друг на друга («основные категории» имеют «нуль» в этом столбце FK).SQL-запрос: привязка внешних ссылок

Предположим, мне нужны все запчасти с fiSparePartCategory=1 и все запасные части, принадлежащие к категории, которая является «подкатегорией» category=1.

Как написать SQL-запрос, который возвращает все запасные части независимо от количества уровней подкатегорий. Надеюсь, вы понимаете мое требование.

Ниже приводится иллюстрация того, что у меня есть. Как сделать его динамичным, чтобы он работал независимо от количества подкатегорий?

Спасибо, Тим

alt text

Ссылка на изображение: http://www.bilder-hochladen.net/files/4709-lg-jpg.html

EDIT: Ниже приводится другой статический подход, который работает, когда есть только один уровень подкатегории:

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

ответ

5

Вы можете использовать recursive Common Table Expression для этого.

В вашем случае вам необходимо получить все идентификаторы категорий запасных частей для определенного идентификатора основной категории и присоединиться к ним с запасными частями. Что-то вроде этого:

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 
+0

Ничего себе, это работает, и я еще не понимаю почему. Спасибо :) –

+0

Я сделал SQL-запрос несколько лучше читаемым, так что его немного легче понять. –

Смежные вопросы