【发布时间】:2020-03-17 20:07:48
【问题描述】:
我的目标是按公司(CNAME)从表分区中选择最高记录(按销售)并删除其他记录。
create table Tn(cname varchar(30), sale int);
表值:
CNAME SALE
1. Apple 4000
2. Apple 5000
3. Apple 4200
4. Samsung 3800
5. Samsung 3900
6. Samsung 3000
7. Samsung 3200
8. Nokia 800
9. Nokia 2000
10. Xiaomi 1100
11. Xiaomi 700
12. Lenovo 600
13. Lenovo 200
14. Lenovo 100
我的代码:
with Cte as
(
select cname,sale, dense_rank() over(partition by cname order by sale desc)as Ranker
from Tn
)
delete from cte where Ranker>1
select * from Tn;
现在这个问题我得到了
ORA-00928: 缺少 SELECT 关键字
如果我不使用这个select * from Tn;会出现这个错误
即使我使用,我也看不到表中的任何变化。
我是使用我的查询的 Oracle SQL Live 平台。请提出我的查询问题。
请在不使用公用表表达式的情况下建议任何其他方式。
更新
我也试过这个:
delete from tn
where sale not in (select max(sale)as A
from tn
group by cname
order by A desc);
但它是在说
ORA-00907: 缺少右括号
【问题讨论】:
-
不能从Oracle中的CTE结果中删除,子选择中的
order by无用且无效
标签: sql oracle common-table-expression