使用其他表中的WHERE条件删除Oracle中的表

时间:2012-03-16 10:56:00

标签: sql oracle

我在Oracle中有两个表A和B:

   A (a1, a2)

   B (b1, b2, b3, b4, b5)

有些行如:

  A(type1, 192.168.94.1)
   A(type1, 192.168.94.2)
   A(type2, 192.168.94.1)

   B(type1, 192, 168, 94, 1)
   B(type1, 192, 168, 94, 3)
   B(type2, 192, 168, 94, 2)

在表A中,我们有 A(type1,192.168.94.1)

在表B中,我们还有 B(type1,192,168,94,1)

在表A中,我想删除行

   A(type1, 192.168.94.1)

因为它的类型类似于表B中的类型

   A.a1 = B.b1
   -> type1 = type1

并且在B

中连接时ip地址重复
   A.a2 = B.b2 ||'.'|| B.b3 ||'.'|| B.b4 ||'.'|| B.5
   -> 192.168.94.1 = 192.168.94.1
你可以给我一些建议吗?

4 个答案:

答案 0 :(得分:3)

delete from A
where ROWID in 
    (select A.ROWID
     from A,B
     where A.A1 = B.B1
     and A.A2 = concat(B.B2, B.B3, B.B4)
    )

答案 1 :(得分:0)

您没有向我们提供有关您尝试做什么的更多信息,但我认为您希望删除A中有B链接的行,您可以尝试:< / p>

DELETE FROM a
 WHERE EXISTS
      (SELECT 1
         FROM B
        WHERE a.a1 = b.b1
          AND a.a2 = CONCAT(b.b2, b.b3, b.b4)); 

假设:

1)表格AB之间的链接在原始帖子中是正确的 2)您只想删除表A

中的记录

希望它有所帮助...

修改 在你的新评论之后,这个问题仍然比较模糊。 我不知道您是只想删除表格A中的IP列数据还是重复行。

如果您只想删除表A中的重复行,那么很简单:

DELETE FROM A
 WHERE rowid NOT IN
            (SELECT MIN(rowid)
               FROM A
              GROUP BY a1, a2);

这假设列a1和a2是表A的主键。

您是否也可以说明您认为需要链接到表格B的原因?

答案 2 :(得分:0)

我怀疑您没有找到任何要删除的内容,因为您可能无法正确加入这两个表,因为您的concat会为您提供concat('192', '168', '94', '1') = '192168941',这与'192.168.94.1'不同

delete from A a
 where exists (
   select 1
     from B b
    where a.a1 = b.b1
      and a.a2 = b.b2 || '.' || b.b3 || '.' || b.b4 || '.' || b.b5)

编辑:

使用concat来连接9个参数会导致too many parameters异常,因此我正在使用||运算符。

答案 3 :(得分:0)

我来自SQL Server世界,所以我尝试了这个:

delete 
from E_CRM_ACTIVITYPOINTER ap
   inner join tmp_activitypointer_for_delete d
       on AP.ACTIVITYID = d.activityid
where ap.current_flag = 1
    and d.start_date != AP.START_DATE

那在我的Oracle 11g环境中没有用,所以我修改了这个:

delete 
from E_CRM_ACTIVITYPOINTER
where (ACTIVITYID,START_DATE) in 
    (
    select AP.ACTIVITYID, AP.START_DATE
    from E_CRM_ACTIVITYPOINTER ap
        inner join tmp_activitypointer_for_delete d
        on AP.ACTIVITYID = d.activityid
    where ap.current_flag = 1
        and d.start_date != AP.START_DATE
    )

希望这会帮助别人。