5

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

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”不可更新,因为派生表的列是派生的或不变的。

关于如何修复此更新的任何想法?

4

3 回答 3

9
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
于 2012-12-27T12:50:25.587 回答
2

您无法更新 CTE,您可能需要buss_item根据 CTE 的结果更新表,试试这个:

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
于 2012-12-27T12:52:04.487 回答
1

您可以更新 CTE,这是 T-SQL 非常有用的高级功能。事实上,您当然不是在更新 CTE,而是在其定义中包含的表格,而您是一步完成的,当我发现这一点时我很惊讶 :) !!经典派生表也可以这样做。您甚至可以进行多个嵌套,并且仍然可以更新定义的第一级中包含的真实表。您还可以在嵌套级别之间使用其他逻辑,例如使用排名函数。

这里报错是因为UNION语句,这种操作是不允许的,没有它更新会成功。

于 2013-09-06T11:58:01.073 回答