2012-12-27 14 views
5

Ich möchte eine Spalte in einem Baum aktualisieren. Ich kam mit der folgenden Aussage auf:SQL Server: Spalte in einem Baum aktualisieren

WITH q AS (
    SELECT t1.* 
    FROM buss_item t1 
    WHERE t1.id_item = 218 

    UNION ALL 

    SELECT t2.* 
    FROM buss_item t2 
    JOIN q ON t2.parent_id = q.id_item 
) 
UPDATE q 
SET default_item = 0 

aber ich erhalte eine Fehlermeldung:

Derived table 'q' is not updatable because a column of the derived table is derived or constant.

Jede Idee, wie Sie dieses Update zu beheben?

Antwort

7
WITH q AS (
    SELECT t1.* 
    FROM buss_item t1 
    WHERE t1.id_item = 218 

    UNION ALL 

    SELECT t2.* 
    FROM buss_item t2 
    JOIN q ON t2.parent_id = q.id_item 
) 
UPDATE buss_item set default_item = 0 from q 
where q.item_ID=buss_item.ItemID 
+2

es funktioniert wie ein Charme. Danke vielmals. –

2

Sie nicht CTE aktualisieren können, müssen Sie wahrscheinlich die buss_item Tabelle aktualisieren, nach den Ergebnissen einer CTE, versuchen Sie dies:

WITH q AS (
    SELECT t1.* 
    FROM buss_item t1 
    WHERE t1.id_item = 218 

    UNION ALL 

    SELECT t2.* 
    FROM buss_item t2 
    JOIN q ON t2.parent_id = q.id_item 
) 

UPDATE bi 
SET  default_item = 0 
FROM buss_item bi 
JOIN q ON q.id_item = bi.id_item 
1

Sie CTE aktualisieren können, und das ist sehr nützlich erweiterte Funktion von T-SQL. In der Tat aktualisieren Sie nicht die CTE natürlich, aber die Tabellen in seiner Definition enthalten und Sie tun alles in einem Schritt, ich war erstaunt, als ich das entdeckte :) !! Dasselbe kann mit klassischen abgeleiteten Tabellen getan werden. Sie können sogar mehrere Nester erstellen und trotzdem Aktualisierungen der realen Tabellen vornehmen, die in der ersten Ebene der Definition enthalten sind. Sie können auch zusätzliche Logik zwischen den Verschachtelungsebenen verwenden, z. B. die Verwendung von Ranking-Funktionen.

Der hier gemeldete Fehler ist wegen der UNION-Anweisung, ist nicht zulässig, wenn diese Art von Operation ausgeführt wird, ohne dass das Update erfolgreich ist.