【问题标题】:SQL Server : update column in a treeSQL Server:更新树中的列
【发布时间】:2012-12-27 12:39:44
【问题描述】:
我想更新树中的一列。我想出了以下声明:
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”不可更新,因为派生表的列是派生的或不变的。
关于如何修复此更新的任何想法?
【问题讨论】:
标签:
sql
sql-server
database-design
tree
sql-update
【解决方案1】:
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】:
您无法更新 CTE,您可能需要根据 CTE 的结果更新 buss_item 表,试试这个:
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
【解决方案3】:
您可以更新 CTE,这是 T-SQL 非常有用的高级功能。
事实上,您当然不是在更新 CTE,而是在其定义中包含的表格,而您是一步完成的,当我发现这一点时我很惊讶 :) !!
经典派生表也可以这样做。
您甚至可以进行多个嵌套,并且仍然可以更新定义的第一级中包含的真实表。您还可以在嵌套级别之间使用其他逻辑,例如使用排名函数。
这里报错是因为UNION语句,这种操作是不允许的,没有它更新成功。