Иерархическая сортировка категорий с идентификатором подкатегории

У меня проблема с сортировкой иерархической категории в 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

Но я хочу показать родителей подкатегории. Например: Телевизор >> Смарт >> ЖК-телевизор

Как я могу это сделать?

Спасибо и король привет!


person Kaan Kılıç    schedule 03.05.2013    source источник


Ответы (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

Чтобы отобразить путь в виде ссылок на веб-странице, вам понадобятся как имена категорий для отображения, так и соответствующие идентификаторы для использования в ссылках. Простой разделитель, который позволяет использовать функцию разделения строк, например. это упрощает код отображения:

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, но это не то, к чему он относится.

person HABO    schedule 04.05.2013
comment
Как я могу ввести ссылку в asp.net. Она работает хорошо, но когда я хочу показать, что на странице asp.net она дает мне строку, и как я могу дать ссылку на каждую категорию в столбце пути? Спасибо - person Kaan Kılıç; 04.05.2013
comment
@KaanKılıç — обновленный ответ, чтобы показать, как обращаться с именами категорий и идентификаторами для создания ссылок. - person HABO; 04.05.2013
comment
Спасибо, сэр. С уважением к хорошему ответу. Это сработало для меня. - person Kaan Kılıç; 04.05.2013