【问题标题】:If the record exists in target but doesn't exist in source, i need to delete it如果记录存在于目标中但不存在于源中,我需要将其删除
【发布时间】:2019-08-18 23:02:51
【问题描述】:

所以,我有两个表,目标表和源表。我需要删除目标表中存在但源表中不存在的行。

还有代码:

MERGE INTO (SELECT id_car_bk, car_brand_bk, car_type_bk, new_car
              FROM car_catalog_backup) CB
USING (SELECT id_car, car_brand, car_type FROM car_catalog) C
ON (CB.id_car_bk = b.id_car)
WHEN NOT MATCHED THEN
  INSERT
    (CB.id_car_bk, CB.car_brand_bk, CB.car_type_bk)
  VALUES
    (C.id_car, C.car_brand, C.car_type)
WHEN MATCHED THEN
  UPDATE SET CB.car_brand_bk = C.car_brand;

【问题讨论】:

  • 那么,您面临的问题是什么?
  • 我不知道如何删除这些行
  • WHEN NOT MATCHED BY SOURCE 如果您想在 MERGE 中管理它是理想的方式

标签: sql oracle sql-delete dml sql-merge


【解决方案1】:

你可以使用

DELETE car_catalog_backup b 
 WHERE not exists 
        ( SELECT 0
            FROM car_catalog c 
           WHERE b.id_car_bk = c.id_car );

DELETE car_catalog_backup b 
 WHERE b.id_car_bk not in 
        ( SELECT c.id_car
            FROM car_catalog c );

假设car_catalogthe source,而car_catalog_backupthe target。第一个更可取,因为它的性能更高。

如果您的目标是通过与您的情况类似的MERGE 语句找出答案,请使用以下

MERGE INTO car_catalog_backup a
USING (SELECT id_car, car_brand, car_type, car_brand_bk 
         FROM car_catalog
         JOIN car_catalog_backup
           ON id_car_bk = id_car
         ) b
   ON (a.id_car_bk = b.id_car)
 WHEN MATCHED THEN
   UPDATE SET a.new_car = 1
   DELETE
   WHERE a.car_brand_bk != b.car_brand 
 WHEN NOT MATCHED THEN
   INSERT
    (id_car_bk, car_brand_bk, car_type_bk)
   VALUES
    (b.id_car, b.car_brand, b.car_type)

以删除与id 列(a.id_car_bk = b.id_car)匹配但与brand code 列(a.car_brand_bk != car_brand)不匹配的记录为例。

Demo

【讨论】:

    【解决方案2】:
    Delete from target
    Where not exists 
    ( 
        Select 1
        From source 
        Where join of source and target
    )
    

    【讨论】:

      【解决方案3】:

      左连接:

      DELETE target 
      FROM target LEFT JOIN source 
      ON target.someid = source.otherid 
      WHERE source.otherid IS NULL;
      

      【讨论】:

      • 不起作用,您能不能更具体一些或尝试其他方法?
      • 这是 Oracle 的正确语法。在一个公共列上加入 2 个表并删除不匹配的行:docs.oracle.com/cd/E17952_01/mysql-5.1-en/delete.html
      • 安德烈 GH,先生。 forpas 给你链接到 mysql 数据库删除语句。
      • akk0rd87,我知道,但我试图了解如何将它应用于我的代码
      猜你喜欢
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2020-05-11
      相关资源
      最近更新 更多