Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于多个表从一个表中删除行_Sql_Database_Oracle_Oracle11g_Oracle Sqldeveloper - Fatal编程技术网

Sql 基于多个表从一个表中删除行

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

我有三个表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=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演示,我觉得应该将子查询限制为返回一行,但是我没有弄清楚你有没有试过已经给出的两个答案中的任何一个?他们帮助过你吗?如果没有,你能评论一下他们,告诉他们为什么没有?