1

SQL Server には、次のように定義された階層カテゴリがいくつかあります。

CREATE TABLE [dbo].[CategoryDesc] (
    [CategoryId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](255) NOT NULL
)

CREATE TABLE [dbo].[CategoryRelationship] (
    [RelationshipId] [int] IDENTITY(1,1) NOT NULL,
    [CategoryId] [int] NOT NULL,
    [ParentId] [int] NULL
)

CREATE TABLE [dbo].[Machine] (
    [MachineId] [int] IDENTITY(1,1) NOT NULL,
    [Make] [varchar](50) NOT NULL,
    [Model] [varchar](255) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [CategoryId] [int] NOT NULL
)

注: 簡潔にするために、主キー、関係、および一部のフィールドは省略されています。

私はすでにCTEを使用して、完全なツリーを生成できるようにしています。その抜粋は次のとおりです。

Foundry/Forging
Foundry/Forging > Core Equipment
Foundry/Forging > Furnaces
Foundry/Forging > Furnaces > Induction
Glass
Glass > Bevelling
Glass > Cutting
Glass > Cutting > Laminated Glass
Glass > Cutting > Manual
Glass > Cutting > Shape
Glass > Cutting > Straight
Glass > Decorating
Glass > Drilling
Glass > Drilling > Horizontal
Glass > Drilling > Vertical
etc

最上位の categoryId を指定して、追加された子カテゴリと追加されたレベルに関係なく、(CreateDate に基づいて) 追加された最新のマシンを返すクエリが必要です。

私が抱えている問題は、マシンが 2 番目または 3 番目のレベルのカテゴリに追加される可能性があり (最上位レベルにはなりません)、CTE が再帰部分での左結合を許可しないことです。

助けてくれてありがとう。:)

4

1 に答える 1

1

スキーマを次のように簡略化しました。

create table cat( id int, name varchar(100) );
create table tree ( id int , parent_id int);
create table item( id int, name varchar(100), cat_id int);

insert into cat values 
( 1, 'HW'),
( 2, 'HW-PC'),
( 3, 'HW-M' ),
( 4, 'Soft'),
(5,'HW-M-N');

insert into tree values
(2,1),
(3,1),
(5,3);

insert into item values 
( 1, 'A', 2),
( 2, 'B', 3);

ルート カテゴリ = 1 に対して要求するクエリは次のとおりです。

with child_id as
( 
  select parent_id as id
      from tree
      where parent_id = 1                         --here cat = 1
   union all
   select tree.id
   from child_id  c
   inner join tree on tree.parent_id = c.id
),
productes as (
   select item.*,
    row_number() over (order by item.id ) as rn  --set your order criteria
   from item 
   inner join child_id c on c.id = item.cat_id
)
select * 
 from productes
where rn = 1

結果

| ID | NAME | CAT_ID | RN |
---------------------------
|  1 |    A |      2 |  1 |
于 2012-12-11T17:46:33.760 に答える