ORACLE SQL 删除带有连接的查询结果

问题描述

我有这个选择,它使用内部连接正常运行并获得预期结果并将这些结果导出为插入语句。我遵循了此处找到的几个示例,但似乎无法正确形成语句。

select a.*  from app_access A inner join  PERSL B on A.empid = B.EMPID and B.CAD_CMD_MASK=7864320;
  

我想删除查询的结果。这就是我现在所在的地方。在遵循此处找到的几个示例后,我似乎无法正确形成该语句。

delete a.* from app_access where app_access A inner join  PERSL B on A.empid = B.EMPID and B.CAD_CMD_MASK=7864320;

一些背景知识 - 这是在 DEV 数据库中,我已将选择的结果写入插入语句。我想在 PRODUCTION 中删除这些记录,并使用 insert 放入来自 DEV 的更新记录。

解决方法

使用:

delete app_access 
where empid IN (SELECT B.EMPID FROM PERSL B WHERE B.CAD_CMD_MASK=7864320)
,

EXISTS 可能是一种选择。

由于我没有您的表格,请查看基于 Scott 的 EMPDEPT 表格的示例。

部门 10 中的当前数据:

SQL> select d.deptno,d.dname,e.ename
  2  from dept d left join emp e on e.deptno = d.deptno
  3  where d.deptno = 10;

    DEPTNO DNAME          ENAME
---------- -------------- ----------
        10 ACCOUNTING     CLARK
        10 ACCOUNTING     KING
        10 ACCOUNTING     MILLER

重复使用该查询来删除这些行:

SQL> delete from emp a
  2  where exists (select null
  3                from dept d left join emp e on e.deptno = d.deptno
  4                where d.deptno = 10
  5                  and e.empno = a.empno
  6               );

3 rows deleted.

还有什么吗?

SQL> select count(*) From emp where deptno = 10;

  COUNT(*)
----------
         0

不,所有内容都已删除。

,

这个使用 EXISTS 的 SQL 应该可以:

delete from app_access a
where exists
   (select 'x' from persl b 
    where b.empid = a.empid 
    and b.cad_cmd_mask = 7864320);

但是,我注意到你写道:

“我想删除 PRODUCTION 中的这些记录,并使用 insert 放入来自 DEV 的更新记录。”

您的意思是要删除 Production 中的记录,然后在 DEV 中更新它们,然后将更新的记录插入回 Production 中吗?如果是这样,为什么不在生产中更新它们而不是删除它们?您仍然可以先将记录插入 DEV,然后在生产中测试更新。