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

ORACLE SQL deleting the results of a query with a join

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

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 数据库中,我已经将 select 的结果写为插入语句。我想在 PRODUCTION 中删除这些记录并使用插入从 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

没有,全部删除了。

这个 SQL 使用 EXISTS 应该做到:

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

不过,我注意到你写道:

“我想在 PRODUCTION 中删除这些记录并使用插入从 DEV 中放入更新的记录。”

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