【问题标题】:Oracle update value of a table using inner join with the same table [duplicate]Oracle 使用同一张表的内连接更新表的值 [重复]
【发布时间】:2018-01-07 20:43:46
【问题描述】:

我正在尝试使用此语句更新 bplustree 表的深度列,该语句在 MYSQL 上运行良好,但在 oracle 上出现此错误:

BEGIN    
  WHILE EXISTS (SELECT * FROM bplustree WHERE depth IS NULL) 
  LOOP    
    UPDATE T SET T.depth = P.depth + 1
        FROM bplustree AS T INNER JOIN bplustree AS P 
        ON (T.parent_node_id = P.node_id) 
    WHERE P.depth >= 0 AND T.depth IS NULL;
  END LOOP;
END;

错误报告 -
ORA-06550:第 4 行,第 3 列:
PL/SQL:ORA-00933:SQL 命令未正确结束
ORA-06550:第 3 行,第 2 列:
PL/SQL:忽略 SQL 语句
06550. 00000 - “第 %s 行,第 %s 列:\n%s”
*原因:通常是 PL/SQL 编译错误。

【问题讨论】:

  • Oracle 不支持UPDATE 中的FROM 子句,所以我不知道您要做什么。
  • 我试图通过放置一个循环遍历树的所有节点来计算树中每个节点的深度@GordonLinoff

标签: sql oracle inner-join


【解决方案1】:

您可以在merge 的帮助下组合updateselect,如下所示:

MERGE INTO bplustree t1
USING
(
  SELECT P.depth + 1 depth, p.node_id
    FROM bplustree T INNER JOIN bplustree P
      ON (T.parent_node_id = P.node_id)    
    WHERE P.depth >= 0 AND T.depth IS NULL 
) t2
ON ( t1.node_id = t2.node_id )
WHEN MATCHED THEN UPDATE SET
t1.depth = t2.depth; 

D e m o

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多