2010-08-12 4 views
2

Структура таблицыУдалить Reccords из таблицы рекурсивно - SQL Server 2008

ID  DESC    PARENT_ID** 

35151 Parent   35154 
35152 System   35151 
35153 Same as System 35151 
35154 ParentsParent  35157 
35156 Product   35157 
35157 Login Group  35159 

Где

Id является первичным ключом, и parent_id является внешний ключ, указанный в той же таблице

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

ответ

1

Посмотрите на этот вопрос:

SQL Server: Self-reference FK, trigger instead of ON DELETE CASCADE

FK с ON DELETE CASCADE не работает в SQL Express 2005, может быть, это будет работа в 2008 году

ALTER TABLE SomeChildTable 
CONSTRAINT YOurConstraintName 
FOREIGN KEY (YourParentId) 
REFERENCES YourParentTable(ParentTableId) ON DELETE CASCADE; 
+0

Я не могу использовать триггер как сейчас. Могу ли я сделать это без триггера? – SRA

+0

@Sunil Ramu, я обновил ответ, однако он не может работать в MSSQL, но попробуйте пожалуйста. –

5

Вы можете используйте рекурсивный CTE, чтобы удалить список.

https://data.stackexchange.com/stackoverflow/query/9287/so3466713

-- SO3466713 

CREATE TABLE #t (
    ID int NOT NULL 
    ,[DESC] varchar(50) NOT NULL 
    ,PARENT_ID int NULL 
) 

INSERT INTO #t VALUES 
(35151, 'Parent', 35154) 
,(35152, 'System', 35151) 
,(35153, 'Same as System', 35151) 
,(35154, 'ParentsParent', 35157) 
,(35156, 'Product', 35157) 
,(35157, 'Login Group', 35159) 

;WITH tree AS (
    SELECT * 
    FROM #t 
    WHERE [DESC] = 'Parent' 

    UNION ALL 

    SELECT c.* 
    FROM #t AS c 
    INNER JOIN tree AS p 
     ON c.PARENT_ID = p.ID 
) 
-- SELECT * 
-- FROM tree 
DELETE FROM #t WHERE ID IN (SELECT ID FROM tree) 

SELECT * FROM #t​ 
+0

Описание - всего лишь текст. Пожалуйста, проигнорируйте это. Важным типом является идентификатор и ParentId. – SRA

+0

@Sunil Ramu - [DESC] используется только для определения дерева, которое вы хотите удалить. Вы можете указать любые критерии, которые вы хотите определить корневой узел, из которого необходимо удалить всех детей. –

+0

+1, хороший пример кода –

Смежные вопросы