sql - 根据第三个表中的列值删除表中的行

标签 sql database oracle oracle-sqldeveloper

我有三个表 Table1、Table2 和 Table3,以及以下查询,该查询删除 Table1 中的行

delete from Table1 
where EXISTS
(select (1) from Table2
 where Table1.col1=Table2.col1
 AND   Table1.col2=Table2.col2
 AND   Table1.col3=(select **Table3.col3 from Table3** inner join Table2 on Table3.col1=Table2.col1)

这个查询正确吗?如果没有,如何在where条件中使用第三个表?

编辑:另外,如果我们想从 table2 中删除本身与 table3 连接的行,请解释如何重写查询?

最佳答案

这是一种方法:

delete from table1 
where (col1, col2, col3) in (
  select t1.col1, t1.col2, t1.col3
  from table1 t1
    join table2 t2 on t1.col1 = t2.col1 and t1.col2 = t2.col2
    join table3 t3 on t1.col3 = t3.col3 and t2.col1 = t3.col1
  );

或者使用EXISTS可能会更快:

delete table1 
where exists (
  select * 
  from table2
    join table3 on table2.col1 = table3.col1
  where table1.col3 = table3.col3 and 
    table1.col1 = table2.col1 and 
    table1.col2 = table2.col2);

关于sql - 根据第三个表中的列值删除表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19228491/

相关文章:

mysql - 一个查询即可显示升级链接和非升级链接

linux - Docker 容器数据卷映射失败?

java - OraclePreparedStatement.executeUpdate() 是否通过抛出 SQLException 实例来处理连接池耗尽?

mysql - 为什么我在 MySQL 中的进程由于某种原因而消失了?

java - 从java程序备份mysql数据库

sql - 选择数据并将其显示为列标题

java - Spring Data JDBC是否支持自定义类型转换器

sql - 在 Oracle 的 Greatest 函数中处理 Null

sql - 用HQL计算两个字段之间的差异范围

mysql - sh 脚本在 crontab 中不起作用