【问题标题】:Delete rows present in other table删除其他表中存在的行
【发布时间】:2013-06-04 20:48:19
【问题描述】:

我有两个表 A 和 B,其中包含许多列,其中两个正在使用的是 SKU 和 Typedesc。

我通过在 sku 和 typedesc 上连接 A 和 B 创建了一个表 C

create table C as
    select A.*
    from A inner join
         B
         on A.sku=B.sku and trim(A.typedesc)=trim(B.typedesc)

C 有大约。 130,000 条记录

现在我想删除 A 中存在于 C 中的行

delete from A A1
    where exists (select 1
                  from C c1
                  where A1.sku=c1.sku and trim(A1.typedesc)=trim(c1.typedesc)
                 )

它说删除了 145,000 行。

额外的 15,000 行是从哪里来的?我的删除查询有问题吗?所以当我加入两个表时,C 也应该有 145,000,但它只有 130,000!为什么会这样? A 或 B 不包含任何主键。

即使我直接从A中删除B,删除的行数仍然是145,000。

delete from A A1
    where exists (select 1
                  from B b1
                  where A1.sku=b1.sku and trim(A1.typedesc)=trim(b1.typedesc)
                 )

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    EXISTS 看起来不错,但如果不查看哪些行被删除,就很难判断问题出在哪里,而且我不想和你一样查看 145,000 行 :)

    试试这个替代方案,看看是否有什么不同:

    DELETE FROM A
    WHERE (SKU, TRIM(TypeDesc)) IN (SELECT SKU, TRIM(TypeDesc) FROM B)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2021-02-17
      • 2021-11-11
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多