2

2 つのテーブルがあり、1 つのテーブルは商品に関連するすべてのデータを保持するアイテム コンテナーです。もう 1 つのテーブルはカテゴリ用で、階層を使用してデータが編成されています。
クエリの目的は、選択したカテゴリから順にカテゴリに一致するアイテムを一覧表示することです。

例:

CatID: 3, Parent: Root, Name: Computers  
CatID: 4, Parent: 3, Name: Laptops  
CatID: 5, Parent: 3, Name: Monitors  
CatID: 6, Parent: 3, Name: Printers  
CatID: 7, Parent: 6, Name: Laser  
CatID: 8, Parent: 6, Name: Ink  
CatID: 9, Parent: 6, Name: Multifunction  
CatID: 10, Parent: 6, Name: Copier  

3 を選択CatIDするとすべてのコンピュータ製品が表示されますが、CatID6 を選択するとプリンタのみが表示されます (7、8、9、10 の項目CatID)。

私は階層IDに慣れていないので、このクエリにアプローチする方法がほとんどわかりません。

貢献してくれたすべての人に感謝します。

カルロス

両方のテーブルのスキーマ アイデアは、mz_category を ic_item_cat に結合することです。これにより、クエリは特定のカテゴリだけでなく、すべての子カテゴリのすべてのアイテムを一覧表示できます。これは、すべてのカテゴリが階層に従って表示される特別な「自作」のツリービューを対象としています。ユーザーがカテゴリをクリックすると、そのカテゴリに属する​​すべてのアイテムと、子カテゴリに属する​​すべてのアイテムも表示されます。アイデアが得られることを願っています。

/****** Object:  Table [dbo].[mz_category]    Script Date: 04/26/2012 19:14:34 ******/
SET ARITHABORT ON
GO
SET CONCAT_NULL_YIELDS_NULL ON
GO
SET ANSI_NULLS ON
GO
SET ANSI_PADDING ON
GO
SET ANSI_WARNINGS ON
GO
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
SET ARITHABORT ON
GO
/****** Categories Table ******/
CREATE TABLE [dbo].[mz_category](
    [CatNode] [hierarchyid] NOT NULL,
    [CatLevel]  AS ([CatNode].[GetLevel]()),
    [CatID] [int] NOT NULL,
    [CatName] [varchar](80) NOT NULL,
    [SectorId] [varchar](2) NULL,
    [CatIcon] [varchar](255) NULL,
    [oldCat] [varchar](8) NULL,
PRIMARY KEY CLUSTERED 
(
    [CatNode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED 
(
    [CatID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[ic_item_cat]    Script Date: 04/26/2012 19:14:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
/****** Items Table ******/
CREATE TABLE [dbo].[ic_item_cat](
    [item_code] [varchar](25) NOT NULL,
    [item_description] [varchar](80) NULL,
    [item_sector] [varchar](2) NULL,
    [item_line] [varchar](2) NULL,
    [item_reference] [varchar](50) NULL,
    [item_upcean] [varchar](50) NULL,
    [item_category] [int] NULL,
    [item_brand] [varchar](8) NULL,
    [item_cost] [decimal](12, 4) NULL,
    [item_price1] [decimal](12, 4) NULL,
    [item_price2] [decimal](12, 4) NULL,
    [item_price3] [decimal](12, 4) NULL,
    [item_webprice] [decimal](12, 4) NULL,
    [item_dprice1] [decimal](12, 4) NULL,
    [item_dprice2] [decimal](12, 4) NULL,
    [item_dprice3] [decimal](12, 4) NULL,
    [item_lastcost] [decimal](12, 4) NULL,
    [item_lastcostdate] [datetime] NULL,
    [item_lastqtyout] [decimal](12, 4) NULL,
    [item_lastqtyoutdate] [datetime] NULL,
    [item_lastqtyin] [decimal](12, 4) NULL,
    [item_lastqtyindate] [datetime] NULL,
    [item_additionaldesc] [varchar](max) NULL,
    [item_weight] [decimal](12, 4) NULL,
    [item_weight_measure] [varchar](2) NULL,
    [item_width] [decimal](12, 4) NULL,
    [item_width_measure] [varchar](2) NULL,
    [item_length] [decimal](12, 4) NULL,
    [item_length_measure] [varchar](2) NULL,
    [item_height] [decimal](12, 4) NULL,
    [item_height_measure] [varchar](2) NULL,
    [item_whpackdesc] [varchar](80) NULL,
    [item_salespackdesc] [varchar](80) NULL,
    [item_purchpackdesc] [varchar](80) NULL,
    [item_salespackconv] [decimal](12, 4) NULL,
    [item_purchpackconv] [decimal](12, 4) NULL,
    [item_warranty] [varchar](2) NULL,
    [item_delivtime] [varchar](2) NULL,
    [item_rating] [int] NULL,
    [item_vat] [varchar](2) NULL,
    [item_status] [int] NULL,
    [item_avgleadtime] [int] NULL,
    [web_flag] [bit] NULL,
    [partner_id] [varchar](25) NULL,
    [unique_id] [uniqueidentifier] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
4

3 に答える 3

1

このようなものは機能しますか?

DECLARE @CatNode hierarchyid;
SET @CatNode = (
    SELECT CatNode from mz_category
    WHERE CatID = @CatID
  );
SELECT * FROM Items
WHERE CatID IN (
  SELECT  CatID
  FROM    mz_category
  WHERE   CatNode.IsDescendantOf(@CatNode) = 1
);
于 2012-04-26T18:28:17.927 に答える
1

を使用できますCTE

  • 開始レコードを選択
  • 再帰部分でこれらの開始レコードの子を取得します

SQL ステートメント

;WITH q AS (
  SELECT  CatID, Parent, Name
  FROM    YourTable
  WHERE   CatID = 3
  UNION ALL
  SELECT  t.CatID, t.Parent, t.Name
  FROM    q
          INNER JOIN YourTable t ON t.Parent = q.CatID
)
SELECT  *
FROM    q
于 2012-04-26T08:58:10.230 に答える
0
DECLARE @CatID hierarchyid = '/6/';

WITH RootCategory AS (
    SELECT  CatID,
            Parent,
            Name
    FROM    Category
    WHERE   CatID = @CatID

    UNION ALL

    SELECT      C.CatID,
                C.Parent,
                C.Name
    FROM        Category C
    INNER JOIN  RootCategory R ON C.Parent = R.CatID
)
SELECT  *
FROM    RootCategory
于 2012-04-26T09:00:49.563 に答える