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语句,更新将成功