2012-05-07 1 views
1

Я, ребята,
У меня есть таблица категории с категорией категорий (первичный ключ), ParentID (int not null) и Category (nvarchar not null).
Я пытаюсь вставить и извлечь в этой таблице категории с идентификатором категории ID и подкатегориями с идентификатором ParentID.
Я пробовал целый уик-энд не повезло и надеюсь, что вы можете мне помочь. I'm с помощью MSSQL 2008. структуры
таблица должна выглядеть следующим образом:Таблица вложенных категорий с категорией и подкатегорией

-Category1   
     SubCategory1 
     SubCategory2 
    ... 

-Category2 
      SubCategory2 
      SubCategory2 
    ... 

Любая помощь будет очень ценится

+1

Какой код вы старались? –

+0

Из ваших комментариев, мне кажется, что проблема больше в области контроля пользовательского интерфейса (например, GridView), как обновить данные на вставке строк gridview и не столько на стороне базы данных. Если это так, я думаю, вы должны уточнить, что в вашем вопросе, если это проблема, связанная с технологией (например, WPF, ASP.NET, Windows Forms и т. Д.). Кстати, вы видели пример [RowCommand Event] (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowcommand.aspx)? –

+0

Спасибо Адольфо. Я исследовал событие rowcommand и думал, что это может помочь. Я попробую. – Totem

ответ

0

Проверить Common Table Expressions, те позволяют создавать «рекурсивного» выбирает , http://www.mssqltips.com/sqlservertip/1520/recursive-queries-using-common-table-expressions-cte-in-sql-server/

+0

Спасибо, но статья не дает мне то, что мне нужно. Сценарий - простая вставка db (отлично работает), а затем отображает результат из категорий (отлично работает). Теперь, как выбрать категорию (CategoryID) и вставить подкатегорию (с идентификатором ParentID) внизу. Я использовал Gridview для отображения результата. – Totem

+0

Спасибо Мартин, я думаю, что нашел то, что искал здесь: http://sqllessons.com/categories.html – Totem

0

Вы можете использовать рекурсивное общее табличное выражение:

WITH cteTable(madeUpColA, madeUpColB, Etc) as 
(
    -- this select statement with the union all is what does the recursive query 
    SELECT aCol as madeUpColA, bCol as madeUpColB, Etc 
    from dbo.someTable 
    UNION ALL 
    SELECT aCol as madeUpColA, bCol as madeUpColB, Etc 
    FROM dbo.someTable st 
    INNER JOIN cteTable as c -- inner join on relationship 
    ON st.aCol = c.madeUpColA 
) 
-- this select statement is what retrieves the data from the above query 
SELECT madeUpColA, madeUpColB, Etc 
FROM cteTable 
-- add your other criteria here 

Вы можете использовать MSDN documentation для WITH заявления специализироваться ваш запрос

+0

Спасибо за ответ. Но я не думаю, что это должно быть так сложно. Хотелось бы, чтобы я знал способ выбрать вставленную категорию из gridview или datalist и на основе идентификатора этой категории вставить SubCategory в таблицу Categories. Я уверен, что магия должна произойти в rowcommand gridview, но я не знаю, как ее поймать :( – Totem

+0

Спасибо Чарльз, я думаю, что нашел то, что искал здесь: http://sqllessons.com /categories.html – Totem

+0

Заявление, которое я разместил, не позволяет вам беспокоиться о глубине ваших подкатегорий. Например, на странице, которую вы опубликовали, использовалось 3 заявления о присоединении для получения глубины 4 подкатегорий. если глубина 1 или много, она все равно вернет все результаты. –

0

Вы просто ищете простое автообъединение? Если это так, это должно работать:

select parent.category, subcat.category as subcategory 
from Category subcat join 
    Category parent 
    on subscat.parentid = parent.categoryid 

Или вам нужно пройти целую цепочку родителей? Если да, то рекурсивный КТЭ является лучшим подходом.

+0

Извините за поздний обратной связи. Я не понимаю ваш запрос, но да, это должен быть простой сустав. И это касается только таблицы tblCategory: CategoryID [int] Первичный ключ, ParentID [int] NOT NULL, Категория [nvarchar] (255) NOT NULL. – Totem

+0

Спасибо, Гордон, я думаю, что нашел то, что искал здесь: http://sqllessons.com/categories.html – Totem