sql >> Database >  >> RDS >> Sqlserver

alle geneste kinderen ophalen voor een ouder-ID

Deze puinhoop produceert het voorbeeldresultaat uit de voorbeeldgegevens. Het is nog steeds niet duidelijk wat jij denk dat het algoritme zou moeten zijn.

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;

Ik vermoed dat het probleem is dat je je gegevens op een scheve manier hebt gemengd. Een hiërarchie van categorieën wordt gewoonlijk weergegeven als:

declare @Categories as Table (
  CategoryId Int Identity,
  Category NVarChar(128),
  ParentCategoryId Int Null );

De hoofdmap van elke hiërarchie wordt aangegeven door ParentCategoryId is NULL . Hierdoor kan een willekeurig aantal onafhankelijke bomen naast elkaar bestaan ​​in een enkele tabel en is deze niet afhankelijk van het bestaan ​​van producten.

Als producten zijn toegewezen aan een enkele (sub)categorie, voeg dan gewoon de CategoryId toe in de Products tafel. Als een product kan worden toegewezen aan meerdere (sub)categorieën, mogelijk in verschillende hiërarchieën, gebruik dan een aparte tabel om ze te relateren:

declare @ProductCategories as Table (
  ProductId Int,
  CategoryId Int );



  1. Probleem met JPA-project in Eclipse - fout in klasse geannoteerd @Entity:Tabel xxx kan niet worden opgelost

  2. Importeer MySQL-DB-Dump in een Rails-app met behulp van een migratiebestand

  3. yii2 hoe zoeken te gebruiken met sqldataProvider

  4. ADO .NET vs. SQL Server Management Studio - ADO presteert slechter