2

Web サービスに接続して、データの一覧を受け取ります。リスト内の各レコードには 3 つのカテゴリ フィールドが含まれており、次の列マークアップを使用して製品テーブルに保存します。

CategoryName    SubCategoryName    SubSubCategoryName
-----------------------------------------------------
Men             Clothing           Jeans
Women           Jewelry            Bracelets
Women           Clothing           Hoodies
Men             Clothing           Hoodies

製品テーブル: カテゴリ名 | サブカテゴリ名 | サブサブカテゴリ名

私がやりたいのは、製品テーブルからカテゴリを抽出し、それらを親子関係のあるテーブルに保存することです。

Id     ParentId    CategoryName         
-------------------------------
1      NULL        Men
2      1           Clothing
3      2           Jeans
4      NULL        Women
5      4           Jewelry
6      5           Bracelets
7      4           Clothing
8      7           Hoodies
9      2           Hoodies

このアクションを実行するためにどの SQL クエリを使用できますか?

4

1 に答える 1

1

まず、新しいテーブルを作成します

create table NewCategories (
  ID int IDENTITY(1,1)  primary key,
  ParentID int null,
  Name nvarchar(max)
)

ここで、すべての行を新しいテーブルに挿入します (これにより ID が割り当てられます)。

insert into NewCategories (Name) 
select distinct CategoryName
from OldCategories

insert into NewCategories (Name) 
select distinct SubCategoryName 
from OldCategories

insert into NewCategories (Name) 
select distinct SubSubCategoryName
from OldCategories

テーブルを更新してNewCategories、ParentID 列を に対して 1 回、 に対して 1 回設定しSubCategoryNameますSubSubCategoryName

update nc2
set ParentID = nc1.ID
from NewCategories nc1
   inner join OldCategories oc on oc.CategoryName = nc1.Name
   inner join NewCategories nc2 on oc.SubCategoryName = nc2.Name

update nc2
set ParentID = nc1.ID
from NewCategories nc1
   inner join OldCategories oc on oc.SubCategoryName = nc1.Name
   inner join NewCategories nc2 on oc.SubSubCategoryName = nc2.Name

*CategoryNameこれは、元のテーブルに重複がないことを前提としています。

SQL フィドル


重複の場合は、次のことができます (少し複雑です)。

--insert all categories
insert into NewCategories (Name) 
select distinct CategoryName
from OldCategories


--only categories in the "new" table now
insert into NewCategories (ParentID, Name)
select distinct n.ID, o.SubCategoryName 
from OldCategories o
  inner join NewCategories n on o.CategoryName = n.Name

--now subcategories are items with non-null parents, 
-- so we need a double join
insert into NewCategories (ParentID, Name)
select distinct n1.ID, o.SubSubCategoryName 
from OldCategories o
  inner join NewCategories n1 on o.SubCategoryName = n1.Name
  inner join NewCategories n2 on o.CategoryName = n2.Name and n2.ID=n1.ParentID

これは、重複を処理するように変更された新しい fiddleです。

于 2013-10-08T09:42:35.477 に答える