Sql 基于多个表从一个表中删除行
我有三个表Table1、Table2和Table3,下面的查询删除了Table2中的行Sql 基于多个表从一个表中删除行,sql,database,oracle,oracle11g,oracle-sqldeveloper,Sql,Database,Oracle,Oracle11g,Oracle Sqldeveloper,我有三个表Table1、Table2和Table3,下面的查询删除了Table2中的行 delete from Table2 where EXISTS (select (1) from Table1 where Table1.col1=Table2.col1 AND Table1.col2=Table2.col2 AND Table1.col3=(select **Table3.col3 from Table3** inner join Table2 on Table3.col1
delete from Table2
where EXISTS
(select (1) from Table1
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)
如果Table1的col3与Table3的col3匹配,Table1的col1、col2与Table2的col1、col2匹配,那么我需要从Table2中删除该行。但是,我无法在此查询中使用表3。请帮助像这样的东西应该可以做到:
delete from
Table2 t2
where
Exists (
select
'x'
from
Table1 t1
inner join
Table3 t3
on t1.col3 = t3.col3
where
t1.col1 = t2.col1 and
t1.col2 = t2.col2
);
使用
合并到语句可能会使您受益匪浅。很难区分Table1,2,3和Col1,2,3示例名称中的所有关系,但可能是这样的:
merge into Table2 t2
using
(select
t2.id
from
Table1 t1
inner join Table2 t2 on t2.col1 = t1.col1 and t2.col2 = t1.col2
inner join Table3 t3 on t3.col3 = t1.col3 and t3.col1 = t2.col1
) t2x
on (t2.id = t2x.id)
when matched then
delete;
这基本上和
delete from Table2 t2
where
t2.id in
(select
t2.id
from
Table1 t1
inner join Table2 t2 on t2.col1 = t1.col1 and t2.col2 = t1.col2
inner join Table3 t3 on t3.col3 = t1.col3 and t3.col1 = t2.col1
)
有错误吗?@GolezTrol有,它说ORA-01427:单行子查询返回多行。这一点很重要。我的意思是一个子选择(你有两个,所以它可能是一个)返回多行,而它不应该返回。第一个子选择在exists
之后,因此允许有多行。但是,在比较中使用=
运算符使用表3
中最里面的select。此子查询不允许返回多行,并导致错误。由于您问题中的查询在语法上不正确,如果您发布实际的查询、表结构和一些实际的示例数据,这会有所帮助。@GolezTrol请查找我尝试的sql fiddle演示,我觉得应该将子查询限制为返回一行,但是我没有弄清楚你有没有试过已经给出的两个答案中的任何一个?他们帮助过你吗?如果没有,你能评论一下他们,告诉他们为什么没有?