Oracle sql不存在会删除我的所有记录

时间:2017-04-07 20:49:59

标签: sql oracle

我有以下表格

product
product_id
parent_product_id

product_details
product_id
percent

和父表:

parent_product
parent_product_id
description_1

parent_product_details
parent_product_id
percent

我需要的是从不存在的product_detail中删除的逻辑(..来自parent_product_detail的数据)

然后

插入不存在的product_detail(来自parent_product_details的数据)

当我执行此

delete from product_details pd
where not exists
  (select ppd.*
    from parent_product pp,
         parent_product pd,
         product p,
         parent_product_details ppd,
         ,product_details pd
         where pp.parent_product_id = '172' 
         and pd.parent_product_id = ppd.parent_product_id   
         and ppd.parent_product_id = pp.parent_product_id
         and pd.product_id = p.product_id -- this filter 
  )
  /

rollback
/

1040 rows deleted 

Roll Back Completed

我遇到的问题是产品没有任何产品细节。因此,当选择/执行子查询时,它只显示一个结果

select ppd.*
        from parent_product pp,
             parent_product pd,
             product p,
             parent_product_details ppd,
             --,product_details pd
             where pp.parent_product_id = '172' 
             and pd.parent_product_id = ppd.parent_product_id   
             and ppd.parent_product_id = pp.parent_product_id
             --and pd.product_id = p.product_id -- this filter 

如何从product_details中删除parent_product_details中不再存在的记录,然后添加带有insert的新记录到不存在的逻辑?

1 个答案:

答案 0 :(得分:2)

我认为你想要一个相关的子查询。您还需要修复语法以使用正确的JOIN语法,而不是古老的commas-in-from-clause事物:

delete from product_details pd
where not exists (select 1
                  from parent_product pp join
                       parent_product_details ppd
                       on ppd.parent_product_id = pp.parent_product_id join
                       parent_product mc
                       on mc.parent_product_id = ppd.component_parent_product_id
                       product p
                       on p.parent_product_id = pp.parent_product_id
                  where pp.parent_product_id = '172' and
                        pd.product_id = p.product_id -- this filter 
                 );