2012-04-26 18 views
1

私は2つのテーブルを持っています.1つのテーブルはアイテムコンテナで、製品に関連するすべてのデータを保持しています。もう1つの表は、階層を使用してデータを編成するカテゴリ用です。
クエリの目的は、選択したカテゴリのカテゴリに一致するアイテムを一覧表示することです。SQL Server INNER JOIN with hierarchyid

例:

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 

選択CatIDが3である場合、すべてのコンピュータ製品が表示されますが、CatID 6が選択された場合、その後にのみプリンタはCatID 7と(アイテム、8、表示されます9および10)

私はむしろ階層IDに新しいです、そして、私はこの質問をどのようにaproachするかについてほとんど考えていません。

貢献したすべての人に感謝します。アイデアはとてもクエリは、特定のカテゴリの、だけでなく、すべての子カテゴリのすべての項目を一覧表示することができ、ic_item_catにmz_categoryに参加することである 両方のテーブルの

カルロス

スキーマ。これは、すべてのカテゴリが階層に従って表示される特別な「自家製」ツリービューを意図しています。ユーザーがカテゴリをクリックすると、そのカテゴリに属する​​すべてのアイテムと、その子カテゴリに属する​​すべてのアイテムが表示されます。あなたはアイデアを得ることを願っています。

/****** 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 
+0

どのRDBMSを使用していますか? –

+0

私はSQL Server 2008 R2を使用しています – Carlos

答えて

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

残念ながら、それは良くありません。 itemsテーブルのすべての行が表示されます。あなたはそれについてのさらなる説明がない限り、コードを変更しなければならなかった。 @mz_categoryは宣言されていないので、私はテーブル名mz-categoryであったので、@を削除しました。 – Carlos

+0

IsDescendantOf(@CatNode)でなければなりません。編集されました。 –

+0

完璧に機能しました!ありがとう、仲間。今度は、私が独学で勉強し続けていく時間です。 – Carlos

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 
+0

あなたの入力をありがとう。おそらく私は私のポストで十分に明確ではない。私が達成しようとしているのは、ic_itemテーブル(アイテム)がカテゴリに属する​​すべてのアイテムとそのカテゴリのすべての子をリストするクエリを持つことです。私はノードからすべての子を取得するためにIsDescendantOfを使用してクエリを作成する方法を知っていますが、itemsテーブルにどのように結合するかわかりません。 – Carlos

+0

申し訳ありませんが、私はあなたが必要なものが何か手がかりがありません。 20の質問のゲームに参加する前に、少なくともスキーマを投稿する必要があります。理想的には、いくつかのテストデータと期待される出力を含めることです。 –

+0

私は達成しようとしているもののスキーマと簡単な説明 – Carlos

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 
+0

あなたの入力をありがとう。おそらく私は私のポストで十分に明確ではない。私が達成しようとしているのは、ic_itemテーブル(アイテム)がカテゴリに属する​​すべてのアイテムとそのカテゴリのすべての子をリストするクエリを持つことです。私はノードからすべての子を取得するためにIsDescendantOfを使用してクエリを作成する方法を知っていますが、itemsテーブルにどのように結合するかわかりません。 – Carlos

+1

Itemsテーブルのスキーマを投稿できますか?この情報なしでは、私はそのクエリを書くことはできません。 – weenoid

+0

私は達成しようとしているもののスキーマと簡単な説明を投稿 – Carlos