Как получить корневой идентификатор родительской дочерней структуры - PullRequest
3 голосов
/ 07 июля 2011

Учитывая идентификатор продукта, мне нужно найти самую верхнюю категорию, в которой продукт существует.

Существует 3 высших категории, назовем их A , B и C .

У меня есть таблица Categories, которая содержит все категории. Это включает категории A , B , C , а также все подкатегории, такие как foo , bar и т. Д. ..

У меня также есть таблица с именем ProductCategories. Эта таблица содержит ссылку на каждый продукт и категорию, к которой относится этот продукт. Если продукт относится к категории Bar , которая является подкатегорией Foo , которая является подкатегорией B , структура имеет вид B -> Foo -> Bar, то рассматриваемый продукт будет иметь 3 записи в таблице ProductCategories.

Это может объяснить это лучше:

Categories
+--------------------------------+
| ID | Name           | ParentID |
+----+----------------+----------+
| 1  | B              | Null     |
+----+----------------+----------+
| 2  | Foo            | 1        |
+----+----------------+----------+
| 3  | Bar            | 2        |
+----+----------------+----------+
| 4  | A              | Null     |
+----+----------------+----------+
| 5  | Subcategory    | 4        |
+----+----------------+----------+
| 6  | AnotherSubCat  | 5        |
+----+----------------+----------+
| 7  | SoManySubCats  | 6        |
+----+----------------+----------+

ProductCategories
+-----------+----------------+
| ProductID | ParentCategory |
+-----------+----------------+
| 50        | 2              |    // Product 50 would be:
+-----------+----------------+    // B -> Foo -> Bar
| 50        | 1              |
+-----------+----------------+
| 50        | 3              |
+-----------+----------------+ 
| 89        | 5              |    // Product 89 would be:
+-----------+----------------+    // A -> Subcategory -> AnotherSubCat -> SoManySubCats
| 89        | 4              |
+-----------+----------------+
| 89        | 7              |
+-----------+----------------+
| 89        | 6              |
+-----------+----------------+

Я ничего не могу поделать с этой структурой базы данных.

Я не могу понять, как написать запрос, в котором я могу указать идентификатор продукта, и он покажет мне высшую категорию: A , B или C .

Надеюсь, кто-нибудь сможет пролить свет на это.

О да, я использую MS Access 2003.

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Мой запрос описан в прозе: объедините категории продукта с таблицей категорий и выберите категорию, для которой в качестве ParentID указано NULL.

SELECT Categories.Name 
FROM Categories, ProductCategories 
WHERE ProductCategories.ParentCategory = Categories.ID 
  AND ProductCategories.ProductID = 50
  AND Categories.ParentID IS NULL
0 голосов
/ 07 июля 2011
<code><pre>
Declare @Categories Table 
(
     ID int,[Name] varchar(100),ParentID int
)
insert into @Categories
Select 1,'B',Null UNION ALL
Select 2,'Foo',1  UNION ALL
Select 3,'Bar',2  UNION ALL
Select 4,'A',Null  UNION ALL
Select 5,'Subcategory',4  UNION ALL
Select 6,'AnotherSubCat',5  UNION ALL
Select 7,'SoManySubCats',6 

Declare @ProductCategories Table
(
    ProductID int,ParentCategory int
)
insert into @ProductCategories
Select  50,2  UNION ALL
Select  50,1  UNION ALL
Select  50,3  UNION ALL
Select  89,5  UNION ALL
Select  89,4 

;with CTE AS
(
    SELECT ID,[Name],ParentId,P.ProductID,
    Cast(ID As Varchar(Max)) As ReportingID,
    Cast([Name] As Varchar(Max)) As ReportingName
    From @Categories As C
    INNER JOIN @ProductCategories As P On C.ID=P.ParentCategory
    Where ParentId is null

    UNION ALL

    SELECT C.ID,C.[Name],C.ParentId,P.ProductID,
    Cast(CTE.ReportingID+'->'+Cast(C.ID As Varchar(10)) As Varchar(Max)) As ReportingID,
    Cast(CTE.ReportingName+'->'+C.[Name] As Varchar(Max)) As ReportingName
    From @Categories As C
    INNER JOIN @ProductCategories As P On C.ID=P.ParentCategory
    INNER JOIN CTE ON C.ParentId=CTE.ID 
)
Select *
From CTE

--now add where cluase to get the reportingname


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...