SQL Developer中DELETE TABLE与DELETE FROM的语法差异及疑问
Oracle中DELETE TABLE(子查询)与常规DELETE FROM的区别
1. 语法本质
你看到的DELETE TABLE(...)是Oracle专属的集合表达式删除语法,TABLE()函数的作用是将子查询返回的集合(包括嵌套表、数组,或是子查询生成的行集合)转换为可操作的关系表结构,不属于标准SQL范畴。
2. 执行逻辑与性能
常规写法:
DELETE FROM hr_info h WHERE h.department_id = 280 AND h.salary > 1700直接在
hr_info表上通过过滤条件定位目标行,一次性完成删除,逻辑简单直接,可读性强。DELETE TABLE(...)写法:DELETE TABLE(SELECT h.people FROM hr_info h WHERE h.department_id = 280) p WHERE p.salary > 1700这里要分两种情况看:
- 如果
h.people是嵌套表类型的列:TABLE()会展开这个嵌套表,此时删除的是嵌套表内部salary>1700的元素,而非hr_info表的整行——这种情况下两者结果完全不同。 - 如果
h.people是笔误(比如实际是SELECT h FROM hr_info h),子查询返回的是hr_info的行集合:Oracle优化器通常会将其重写为等价的常规DELETE,执行计划和性能几乎无差异,不会创建临时表,你的“临时表”猜想是错误的,Oracle不会为这种子查询单独生成物理临时表,而是通过逻辑集合操作解析。
- 如果
3. 适用场景
- 常规
DELETE FROM是通用写法,适合绝大多数单表删除场景,是日常开发的首选。 DELETE TABLE(...)主要用于操作嵌套表或集合类型列的场景,比如只删除嵌套表中的特定元素,而保留主表的行。如果是普通单表删除,这种写法属于冗余写法,没有任何优势。
4. 结果一致性的前提
只有当TABLE()包裹的子查询返回的行集合,和常规DELETE过滤出的行完全一致时,两者结果才会相同。比如你的h.people实际是指向hr_info自身行的引用(或子查询逻辑等价于常规过滤),结果才会一致;但如果people是嵌套表,结果会完全不同。
内容的提问来源于stack exchange,提问作者CodeKiller
相关产品推荐
相关产品推荐

