2012-12-27 15 views
5

Chcę zaktualizować kolumnę w drzewie. Wpadłem z następującym stwierdzeniem:Serwer SQL: kolumna aktualizacji w drzewie

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 

ale pojawia się błąd:

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

Każdy pomysł na jak rozwiązać tę aktualizację?

Odpowiedz

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

działa jak urok. wielkie dzięki. –

2

Nie można aktualizować CTE, prawdopodobnie trzeba zaktualizować tabelę buss_item zgodnie z wynikami WRC, spróbuj tego:

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

Można zaktualizować CTE, a to jest bardzo użyteczna funkcja zaawansowana T-SQL. W rzeczywistości nie aktualizujesz CTE oczywiście, ale tabele zawarte w jego definicji i robisz to wszystko w jednym kroku, byłem zdumiony, gdy odkryłem to :) !! To samo można zrobić z klasycznymi tabelami pochodnymi. Możesz nawet zrobić kilka gniazd i nadal aktualizować prawdziwe tabele zawarte na pierwszym poziomie definicji. Możesz także użyć dodatkowej logiki pomiędzy poziomami gniazd, np. Używając funkcji rankingu.

Podany tutaj błąd wynika z instrukcji UNION, nie jest dozwolony podczas wykonywania tego rodzaju operacji, bez niego aktualizacja się powiedzie.