यह गड़बड़ी नमूना डेटा से नमूना परिणाम उत्पन्न करती है। यह अभी भी स्पष्ट नहीं है कि आप लगता है कि एल्गोरिदम होना चाहिए।
declare @CategoryItems as Table (
CategoryName NVarChar(255),
Label NVarChar(255),
ProductId Int,
ChildCategoryId Int,
CategoryId Int );
declare @Categories as Table (
CategoryId Int,
Name NVarChar(100) );
insert into @CategoryItems ( CategoryName, Label, ProductId, ChildCategoryId, CategoryId ) values
( 'CategoryA', 'Widget A', 1, 0, 1 ),
( 'CategoryB', 'CategoryA', 0, 1, 2 ),
( 'CategoryC', 'Widget B', 2, 0, 3 );
insert into @Categories ( CategoryId, Name ) values
( 1, 'CategoryA' ),
( 2, 'CategoryB' ),
( 3, 'CategoryC' );
select * from @Categories;
select * from @CategoryItems;
declare @TargetProductId as Int = 1;
with Leonard as (
-- Start with the target product.
select 1 as [Row], ProductId, Label, CategoryId, ChildCategoryId
from @CategoryItems
where ProductId = @TargetProductId
union all
-- Add each level of child category.
select L.Row + 1, NULL, CI.Label, CI.CategoryId, CI.ChildCategoryId
from @CategoryItems as CI inner join
Leonard as L on L.CategoryId = CI.ChildCategoryId ),
Gertrude as (
-- Take everything that makes sense.
select Row, ProductId, Label, CategoryId, ChildCategoryId
from Leonard
union
-- Then tack on an extra row for good measure.
select L.Row + 1, NULL, C.Name, NULL, C.CategoryId
from Leonard as L inner join
@Categories as C on C.CategoryId = L.CategoryId
where L.Row = ( select Max( Row ) from Leonard ) )
select Row, ProductId, Label, CategoryId, ChildCategoryId
from Gertrude
order by Row;
मुझे संदेह है कि समस्या यह है कि आपने अपने डेटा को एकतरफा तरीके से मिश्रित किया है। श्रेणियों के पदानुक्रम को आमतौर पर कुछ इस तरह दर्शाया जाता है:
declare @Categories as Table (
CategoryId Int Identity,
Category NVarChar(128),
ParentCategoryId Int Null );
प्रत्येक पदानुक्रम की जड़ ParentCategoryId is NULL
. द्वारा इंगित की गई है . यह किसी भी संख्या में स्वतंत्र पेड़ों को एक ही टेबल में सह-अस्तित्व की अनुमति देता है और किसी भी उत्पाद के अस्तित्व पर निर्भर नहीं करता है।
यदि उत्पादों को एक (उप) श्रेणी को सौंपा गया है तो बस CategoryId
शामिल करें Products
. में मेज़। यदि कोई उत्पाद कई (उप) श्रेणियों को सौंपा जा सकता है, संभवतः विभिन्न पदानुक्रमों में, तो उन्हें संबंधित करने के लिए एक अलग तालिका का उपयोग करें:
declare @ProductCategories as Table (
ProductId Int,
CategoryId Int );