2010-01-19 7 views
0

Tenir compte du Dig suivant, on suppose que tous les trois tables ont une colonne Is_Deleted par défaut, il est réglé sur ... Je veux mettre à jour Is_Deleted = 1 champ de les clients table où CustId = 2 uniquement lorsque les lignes contenant CustId = 2 et Is_Deleted = 1 dans Ordres et OrderItems Tableaux ... Je ne veux pas utiliser Cascade Option .. Toute suggestiondéclaration de mise à jour dans le serveur SQL 2005

alt text http://i.msdn.microsoft.com/ms152507.75c9e4c3-260d-4b8d-8a27-b720d8f4470e(en-US,SQL.90).gif

Répondre

1

Le moyen le plus simple est EXISTS. Je suppose que vous voulez vérifier à la fois les commandes et OrderItems. Cela signifie également que vous ne filtrez que sur CustID une fois.

UPDATE 
    C 
SET 
    IsDeleted = 1 
FROM 
    Customers C 
WHERE 
    C.CustID = 2 
    AND 
    EXISTS (SELECT * 
     FROM 
      Orders O 
     WHERE 
      O.CustID = C.CustID AND O.IsDeleted = 1) 
    AND 
    EXISTS (SELECT * 
     FROM 
      Orders O 
      JOIN 
      OrderItems OI ON O.OrderID = OI.OrderID 
     WHERE 
      O.CustID = C.CustID AND OI.IsDeleted = 1) 
+0

@gbn qui fonctionne ce qui se passe si quelques lignes dans la table OrderItems a Is_Deleted = 0 pour C.CustID = 2 –

+0

Rien. L'EXISTS est faux – gbn

1

Ok sonne bien ... fixons-nous que le drapeau supprimé lorsque toutes les commandes et tous les éléments de commande associés à ce client sont supprimés, ou seulement si au moins 1 article est supprimé.

+0

@Anthonyv ya i ll définir l'indicateur supprimé lorsque toutes les commandes et tous les éléments de commande associés à ce client sont supprimés –

Questions connexes