Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

dapatkan semua anak bersarang untuk id orang tua

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 );



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyinkronkan Database SQL Server 2008 melalui HTTP menggunakan WCF &Sync Framework

  2. Membandingkan Tipe Data Gambar Dalam SQL

  3. Mendapatkan bagian tertentu dari string di T-SQL

  4. Statistik Penggunaan CPU Database SQL Server

  5. Login gagal untuk pengguna 'NT AUTHORITY\NETWORK SERVICE'