ORACLE的WITH语句的一个疑惑
2024-09-27 00:54:27
使用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-: 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=
)
如果把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
最新文章
- JavaScript作用域原理(二)——预编译
- ProFTPD <;=1.3.5 mod_copy 未授权文件复制漏洞
- cocos2dx 3.x(移动修改精灵坐标MoveTo与MoveBy)
- JavaScript对象属性赋值操作的逻辑
- Android高仿微信图片选择功能的PhotoPicker
- ie7下 滚动条内容不动问题
- Java科普之算法剖析
- Java学习之自定义异常
- TCP四次挥手
- 【转】UNREFERENCED_PARAMETER的作用
- ansj原子切分和全切分
- annotation的理解
- spring中整合memcached,以及创建memcache的put和get方法
- ubuntu安装docker以及基本用法
- 实例解析forEach、for...in与for...of
- vs2015 引用lib库和dll
- [eetcode 10]Regular Expression Matching
- ES5之defineProperty
- 前端PHP入门-033-连接数据库-天龙八步
- Python中列表的各种方法