ORACLE的WITH语句的一个疑惑

使用WITH语句,更新表数据,不行:

WITH VN AS (
    SELECT T.ID, T.NODE_ID, N.NODE_TYPE, N.NODE_NAME, T.NODE_LEVEL, T.RN FROM
    (        
            SELECT ID, NODE_ID, LEVEL NODE_LEVEL, ROWNUM RN
                    FROM ORG_NODE_TREE
                    START WITH PARENT_ID IS NULL
                    CONNECT BY PRIOR NODE_ID=PARENT_ID 
    ) T
    LEFT JOIN ORG_NODE N ON N.ID=T.NODE_ID
    ORDER BY T.RN
)
UPDATE ORG_NODE N
SET N.NODE_TYPE='STATION'
WHERE N.ID IN 
(
    SELECT NODE_ID FROM VN
    WHERE NODE_LEVEL=1
)

报以下错误:

[Err] ORA-00933: SQL command not properly ended

不使用WITH,可以:

WITH VN AS (
    SELECT T.ID, T.NODE_ID, N.NODE_TYPE, N.NODE_NAME, T.NODE_LEVEL, T.RN FROM
    (        
            SELECT ID, NODE_ID, LEVEL NODE_LEVEL, ROWNUM RN
                    FROM ORG_NODE_TREE
                    START WITH PARENT_ID IS NULL
                    CONNECT BY PRIOR NODE_ID=PARENT_ID 
    ) T
    LEFT JOIN ORG_NODE N ON N.ID=T.NODE_ID
    ORDER BY T.RN
)

UPDATE ORG_NODE N
SET N.NODE_TYPE='STATION'
WHERE N.ID IN 
(
    SELECT NODE_ID FROM 
(
    SELECT T.ID, T.NODE_ID, N.NODE_TYPE, N.NODE_NAME, T.NODE_LEVEL, T.RN FROM
    (        
            SELECT ID, NODE_ID, LEVEL NODE_LEVEL, ROWNUM RN
                    FROM ORG_NODE_TREE
                    START WITH PARENT_ID IS NULL
                    CONNECT BY PRIOR NODE_ID=PARENT_ID 
    ) T
    LEFT JOIN ORG_NODE N ON N.ID=T.NODE_ID
    ORDER BY T.RN
) 
WHERE NODE_LEVEL=1
) 

如果把WITH后面换成SELECT,一点问题没有,但UPDATE就是报错,好奇怪,难道WITH这种间接地写法不能用于UPDATA。

 

一种说法是:“with必须紧跟引用的select语句,而不是delete,update,merge等”

http://www.itpub.net/thread-1585644-1-1.html

提到可以用MERGE:

--wkc168 发表于 2012-3-2 13:28 
merge into c using (select * from b) a on(c.g=a.h)
when matched then
update set c.e=a.f

http://stackoverflow.com/questions/5380559/update-statement-using-with-clause

 

转载于:https://www.cnblogs.com/legendjslc/p/6876902.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值