2012-03-30 8 views
2

Ich arbeite an einer SQL Server 2008-Datenbank. Diese Datenbank hat zwei Tabellen.Mischen einer IF-Anweisung in einer UPDATE-Anweisung in SQL

Book 
ID 
BookCategoryID 
Name 
IsFlagged 

BookCategory 
ID 
Name 
IsFlagged 

Ich brauche die BookCategory Tabelle zu aktualisieren, so dass, wenn alle Bücher in einer Kategorie gekennzeichnet sind, die IsFlagged Eigenschaft auf dem BookCategory Datensatz auf true gesetzt ist. Andernfalls, wenn keine Bücher in einer Kategorie vorhanden sind, die markiert sind, muss ich die IsFlagged-Eigenschaft für den BookCategory-Datensatz auf false festlegen. Gibt es eine Möglichkeit, dies zu tun? Ich kann es nicht herausfinden. Ich habe etwas wie das Folgende versucht, bin aber immer wieder in eine Sackgasse geraten.

UPDATE 
    BookCategory 
SET 
    IsFlagged = (SELECT COUNT(*) FROM Book WHERE [IsFlagged]=1 AND [BookCategory]=?) 

Antwort

8
UPDATE bc 
SET IsFlagged = CASE WHEN b.ID IS NULL THEN 0 ELSE 1 END 
FROM 
    BookCategory bc LEFT JOIN 
    Book b ON b.BookCategoryID = bc.ID AND b.IsFlagged = 1 
+1

Aus Neugier würde, sobald das Update jedes BookCategory Datensatz oder wäre es einmal aktualisieren für jedes Buch in der Kategorie Liste steht? IE die gleiche BookCategory mehrmals aktualisieren – msmucker0527

+0

Sie sollten wahrscheinlich angeben, dass dies SQL Server-spezifische Syntax ist. Ich glaube nicht, dass andere RDBMS "UPDATE ... FROM" unterstützen, aber ich bin nicht positiv. – JNK

+0

@JNK Sie haben Recht, ich glaube nicht, dass andere RBDMS es unterstützen ... aber das OP spezifiziert SQL Server in der Frage ... –

3
UPDATE BookCategory 
SET IsFlagged = 0 

UPDATE BookCategory b 
SET IsFlagged = 1 
WHERE EXISTS (SELECT 1 FROM Books 
       WHERE bookCategoryid = b.id 
       AND isFlagged = 1) 
Verwandte Themen