Kekacauan ini menghasilkan hasil sampel dari data sampel. Masih belum jelas apa Anda pikir algoritme yang seharusnya.
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;
Saya menduga masalahnya adalah Anda telah mencampur data Anda secara miring. Hirarki kategori biasanya direpresentasikan seperti:
declare @Categories as Table (
CategoryId Int Identity,
Category NVarChar(128),
ParentCategoryId Int Null );
Akar dari setiap hierarki ditunjukkan dengan ParentCategoryId is NULL
. Ini memungkinkan sejumlah pohon independen untuk hidup berdampingan dalam satu tabel dan tidak bergantung pada keberadaan produk apa pun.
Jika produk ditetapkan ke satu (sub)kategori, cukup sertakan CategoryId
di Products
meja. Jika suatu produk dapat ditetapkan ke beberapa (sub) kategori, mungkin dalam hierarki yang berbeda, gunakan tabel terpisah untuk menghubungkannya:
declare @ProductCategories as Table (
ProductId Int,
CategoryId Int );