SQL Server:树中的更新列

SQL Server:树中的更新列,sql,sql-server,database-design,tree,sql-update,Sql,Sql Server,Database Design,Tree,Sql Update,我想更新树中的一列。我提出了以下声明: 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 但我有一个错误: 派生表“q”不可更新,因为派生表的列

我想更新树中的一列。我提出了以下声明:

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
但我有一个错误:

派生表“q”不可更新,因为派生表的列是派生的或常量


您知道如何修复此更新吗?

您无法更新CTE,您可能需要根据CTE的结果更新
buss\u项
表,请尝试以下操作:

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
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

您可以更新CTE,这是T-SQL非常有用的高级特性。 事实上,您当然不是在更新CTE,但它的定义中包含的表格和您在一个步骤中完成的所有操作,当我发现这一点时,我感到惊讶:)!! 对于经典的派生表也可以这样做。 您甚至可以进行多个嵌套,并且仍然可以更新包含在第一级定义中的实际表。您还可以在嵌套级别之间使用其他逻辑,如使用排序函数

此处报告的错误是由于UNION语句引起的,在执行此类操作时是不允许的,没有UNION语句,更新将成功