【问题标题】: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语句,这种操作是不允许的,没有它更新成功。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多