如何使用CTE和INNER JOIN删除行?

Mat*_*upp 5 sql oracle common-table-expression delete-row sql-delete

如何使用CTE和INNER JOIN从表中删除数据?这是有效的语法,所以这应该工作:

with my_cte as (
select distinct var1, var2
from table_a
)
delete  
from table_b b inner join my_cte 
  on var1 = b.datecol and var2 = b.mycol;
Run Code Online (Sandbox Code Playgroud)

Ed *_*bbs 9

在Oracle中,CTE和命令都不INNER JOIN是有效的DELETE.这同样适用于INSERTUPDATE命令.

通常最好的选择是使用DELETE ... WHERE ... IN:

DELETE FROM table_b
WHERE (datecol,  mycol) IN (
  SELECT DISTINCT var1, var2 FROM table_a)
Run Code Online (Sandbox Code Playgroud)

您还可以从子查询的结果中删除.这在文档中有所涉及(尽管很简单).


Ger*_*rat 8

Ed的答案是不正确的,用CTE删除(与INSERT和UPDATE命令同上)。
您不能使用内部联接,但可以将 CTE 与 DELETE 结合使用)。

以下内容在 Oracle 9i+ 中有效:

DELETE FROM table_b WHERE (datecol, mycol) IN (
    WITH my_cte AS (
        SELECT DISTINCT var1, var2
        FROM table_a
    )
    SELECT var1, var2 from my_cte
);
Run Code Online (Sandbox Code Playgroud)

这种特殊情况根本无法从 CTE 中受益,但其他更复杂的语句却可以。