2012-12-27 52 views
5

Tôi muốn cập nhật một cột trong một cây. Tôi đã đưa ra tuyên bố sau:Máy chủ SQL: cập nhật cột trong một cây

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 

nhưng tôi nhận được một lỗi:

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

Bất kỳ ý tưởng về làm thế nào để sửa chữa bản cập nhật này?

Trả lời

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

nó hoạt động như một sự quyến rũ. cảm ơn rất nhiều. –

2

Bạn không thể cập nhật CTE, bạn có thể cần phải cập nhật bảng buss_item theo kết quả của một CTE, hãy thử này:

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

Bạn có thể cập nhật CTE, và đây là tính năng tiên tiến rất hữu ích của T-SQL. Trong thực tế bạn không cập nhật CTE tất nhiên, nhưng các bảng bao gồm trong định nghĩa của nó và bạn đang làm tất cả trong một bước, tôi đã ngạc nhiên khi tôi phát hiện ra điều này :) !! Tương tự có thể được thực hiện với các bảng có nguồn gốc cổ điển. Bạn thậm chí có thể làm nhiều tổ và vẫn cập nhật các bảng thực có trong cấp độ đầu tiên của định nghĩa. Bạn cũng có thể sử dụng logic bổ sung ở giữa các cấp tổ, như sử dụng các hàm xếp hạng.

Lỗi được báo cáo ở đây là do tuyên bố UNION, không được phép khi thực hiện loại thao tác này mà không có bản cập nhật sẽ thành công.

Các vấn đề liên quan