为什么我的查询在 oracle apex 中不起作用?

why does not my query work in oracle apex?

这是我的查询,但是当我在 oracle apex 中 运行 这个时,它给了我以下错误:

delete from 

(select ename,e1.store_id,e1.sal as highest_sal 
from
employees e1 inner join 
(select store_id,max(sal) as sal
 from employees
 group by store_id
) e2
on e1.store_id=e2.store_id
and e1.sal=e2.sal
order by store_id) s

where rowid not in
(select min(rowid) from s
group by highest_sal);

输出为:

ORA-00942: table or view does not exist
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_210200", line 673
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1658
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_210200", line 659
ORA-06512: at "APEX_210200.WWV_FLOW_DYNAMIC_EXEC", line 1829


4. (select store_id,max(sal) as sal
5.  from employees
6.  group by store_id
7. ) e2
8. on e1.store_id=e2.store_id

当我运行括号里的代码,单独有别名s的时候,运行没有任何问题,但是放在这段代码里,就报错

updated:我的目标是首先根据store_id对数据进行分组,得到每组数据中最大的sal,然后加入main table本身其中sal和store_id是一样的,并显示它的名字,由此产生的table叫做s。然后我想从 table 中删除重复的行(它们具有相同的 sal),为此我们根据 highest_sal 和 select 之间的最小 rowid 进行分组,然后删除那些不在子查询中的 rowId。结果,获得了非复制品。 (这是删除重复行的技巧。)

您似乎想要删除每个 store_id 分组中具有最高 sal 的所有行,每个组中具有最低 ROWID 的行除外。

您可以使用分析函数来做到这一点。或者:

DELETE FROM employees
WHERE  ROWID IN (
  SELECT ROWID
  FROM   (
    SELECT RANK() OVER (PARTITION BY store_id ORDER BY sal DESC) AS rnk,
           ROW_NUMBER() OVER (PARTITION BY store_id ORDER BY sal DESC, ROWID ASC)
             AS rn
    FROM   employees
  )
  WHERE  rnk = 1
  AND    rn > 1
);

或:

DELETE FROM employees
WHERE  ROWID IN (
  SELECT ROWID
  FROM   (
    SELECT sal,
           MAX(sal) OVER (PARTITION BY store_id) AS max_sal,
           MIN(ROWID) KEEP (DENSE_RANK LAST ORDER BY sal)
                      OVER (PARTITION BY store_id) AS min_rid_for_max_sal
    FROM   employees
  )
  WHERE  sal = max_sal
  AND    ROWID != min_rid_for_max_sal
);

或者,从 Oracle 12 开始,在相关 sub-query:

中使用行限制子句
DELETE FROM employees e
WHERE  ROWID IN (
  SELECT ROWID
  FROM   (
    SELECT sal
    FROM   employees x
    WHERE  e.store_id = x.store_id
    ORDER BY sal DESC
    FETCH FIRST ROW WITH TIES
  )
  ORDER BY ROWID
  OFFSET 1 ROW FETCH NEXT 100 PERCENT ROWS ONLY
);

其中,对于示例数据:

CREATE TABLE employees (ename, store_id, sal) AS
SELECT 'A', 1, 1 FROM DUAL UNION ALL
SELECT 'B', 1, 2 FROM DUAL UNION ALL
SELECT 'C', 1, 3 FROM DUAL UNION ALL
SELECT 'D', 2, 1 FROM DUAL UNION ALL
SELECT 'E', 2, 2 FROM DUAL UNION ALL
SELECT 'F', 2, 2 FROM DUAL;

全部删除第f行。

db<>fiddle here