0

mssql の階層カテゴリの並べ替えに問題があります。次のコード セグメントにカテゴリとそのレベルをリストする SQL コードがあります。

WITH TempCtgry (CtgryID, CtgryName, ParentCtgryId, Lvl)AS (SELECT CategoryID,CategoryName ,ParentCatID, 0 as Level FROM Category r WHERE r.ParentCatID IS NULL UNION ALL SELECT r1.CategoryID, r1.CategoryName, r1.ParentCatID, TempCtgry.Lvl+1 FROM Category r1 INNER JOIN TempCtgry on r1.ParentCatID= TempCtgry.CtgryID) SELECT * FROM TempCtgry

しかし、私はサブカテゴリの親を表示したい.例えば: テレビ >> スマート >> 液晶テレビ

どうやってやるの?

ありがとうございます。

4

1 に答える 1

1

レベルを数えるのと同じように、どんどん積み上げていきましょう:

WITH TempCtgry ( CtgryID, CtgryName, ParentCtgryId, Lvl ) AS (
  SELECT CategoryID, CategoryName, ParentCatID, 0 as Level,
    Convert( VarChar(1024), CategoryName ) as Path
    FROM Category r
    WHERE r.ParentCatID IS NULL
  UNION ALL
  SELECT r1.CategoryID, r1.CategoryName, r1.ParentCatID, TempCtgry.Lvl + 1,
    Convert( VarChar(1024), Path + ' >> ' + r1.CategoryName ) as Path
    FROM Category r1 INNER JOIN
      TempCtgry on r1.ParentCatID = TempCtgry.CtgryID
  )
  SELECT *
    FROM TempCtgry

パスをリンクとして Web ページに表示するには、表示するカテゴリ名と、リンクで使用する対応する ID の両方が必要です。thisなどの文字列分割関数を使用できる単純な区切り記号を使用すると、表示コードが簡素化されます。

WITH TempCtgry ( CtgryID, CtgryName, ParentCtgryId, Lvl ) AS (
  SELECT CategoryID, CategoryName, ParentCatID, 0 as Level,
    Convert( VarChar(1024), CategoryName ) as Path,
    Convert( VarChar(1024), CategoryID ) as PathIds
    FROM Category r
    WHERE r.ParentCatID IS NULL
  UNION ALL
  SELECT r1.CategoryID, r1.CategoryName, r1.ParentCatID, TempCtgry.Lvl + 1,
    Convert( VarChar(1024), Path + '|' + r1.CategoryName ) as Path,
    Convert( VarChar(1024), PathIds + '|' + Convert( VarChar(9), CategoryId ) ) as PathIds
    FROM Category r1 INNER JOIN
      TempCtgry on r1.ParentCatID = TempCtgry.CtgryID
  )
  SELECT *
    FROM TempCtgry

注: これは、垂直バー ("|") がカテゴリ名に出現しないことを前提としています。

ASP.NET コードは、両方のパス文字列を分割し、それらを一緒にたどってリンクを作成する必要があります。便利な表示セパレータは "»" (U+00BB: 右向き二重角引用符) です。

必要な HTML を生成するためのすべてのコードをクエリに追加することは可能ですが、それが属する場所ではありません。

于 2013-05-04T00:40:03.280 に答える