【问题标题】:DB Query not running as wanted数据库查询未按要求运行
【发布时间】: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


【解决方案1】:

如果您想从原始表中删除,那么CTE 将无济于事。

您将需要以下内容:

Delete from tn where rowid in
(Select rid from
(select cname,
        sale, 
        dense_rank() over(partition by cname order by sale desc)as Ranker, 
        rowid as rid
  from Tn) 
     where ranker > 1)

干杯!!

【讨论】:

  • 似乎会起作用!我会检查并回复你...你能告诉你为什么“从 tn 中删除销售不在(select max(sale)as A from tn group by cname order by A desc);”这个查询没有运行? ???它说右括号丢失,但我认为没有问题
  • 您可以在删除订单后尝试吗?喜欢:`从不销售的tn中删除(select max(sale)as A from tn group by cname);
  • 另外,我建议不要使用not in,因为它处理空值的方式不同。所以完全不推荐。
【解决方案2】:

有趣!我从未尝试从 CTE 中删除。相反,我只会插入我想要的记录。

;with cte as
(
    select      *
    from
    (
        select      *
                    ,DENSE_RANK() over(partition by cname order by sale)as Ranker
        from        Tn
    )_
    where       Ranker = 1
)
select * from cte;

【讨论】:

  • 我收到此错误:ORA-00923: FROM 关键字未在预期的位置找到您能否也检查一下 delete 吗?
  • CTE 是一个实时查询(因此每次引用它时都会对其进行评估),这意味着它不能适应 DELETE——您在 SELECT 中应用您的过滤器。如果您想按原样执行 DELETE,则可以使用临时表或表变量。两者都很浪费——为什么要提取您将在下一步中删除的数据?再次,在 SELECT 中应用您的过滤器。我可能错过了什么。您是在尝试查看每个 CName BY Sale 的 TOP 1 记录,还是尝试从基础表中删除数据?
  • 好的,那么请提出解决问题的任何解决方案。删除其他行是一项任务
  • 所以您想从 Tn 中删除记录,而不是从您的 CTE 中删除记录,对吗?
  • 是的,是的,我想从 Tn 中删除它
猜你喜欢
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
相关资源
最近更新 更多