2016-02-24 1 views
0

J'ai besoin d'aide pour faire une requête où je mets à jour une ligne initialement basée sur la description et tous les parents, si existe.Mettre à jour une ligne et tous les 'parents' (s'il existe)

Ma tableItemMenu:

Id

DescName

IdParent

BolActive

Donc, je dois activer (réglage BolActive = 1) une ligne où Description je vais informer dans la requête, puis mettre à jour toutes les lignes si IdParent est pas nul/vide et si elle existe dans la même table (IdParent = Id).

Quelque chose comme:

Mise à jour ItemMenu mis BolActive = 1 où DescName = 'MyMenu'

alors je dois vérifier si IdParent de Select * from ItemMenu où DescName = 'MyMenu' existe

Si oui, je vais Mise à jour ItemMenu = 1 BolActive définir où IdParent (de la précédente select) = Id et vérifier à nouveau si IdParent existe ici ... jusqu'à ce que IdParent est nulle/bl ank et il s'arrête

Est-ce possible?

P.s. Je ne peux pas changer la structure de la table.

+0

Bien sûr, il est possible. Vous pouvez le faire avec un cte récursif. Si vous avez besoin d'aide, il serait très utile de pouvoir publier le ddl et quelques exemples de données. –

Répondre

2

En supposant que je comprenne le résultat de code souhaité, essayez une mise à jour en utilisant une expression de table commune récursive. Fourni une capture d'écran. Toutes mes excuses pour le formatage de mon texte noob.

http://s12.postimg.org/cw8yz0isd/Capture.jpg

DECLARE @description AS VARCHAR(50) = 'Hello World' 

;WITH CTE AS (

    SELECT Menu.* 
    FROM dbo.ItemMenu Menu 
    WHERE Menu.descname = @description 
    UNION ALL 
    SELECT Menu2.* 
    FROM dbo.ItemMenu Menu2 
    JOIN CTE 
    ON  Menu2.idParent = CTE.Id 
) 
Update ActualMenu 
SET  BolActive = 1 
FROM CTE Menu 
JOIN dbo.ItemMenu ActualMenu 
ON  ActualMenu.Id = Menu.Id 
+0

très bien fonctionné, je viens de changer "ON Menu2.idParent = CTE.Id" à "ON Menu2.id = CTE.idParent" . Merci o/ – Shadi

+0

Ouais woops désolé pour ce mélange. Content que tu l'aies compris. –