SQL删除一个表不存在与另外一个表中的记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL删除一个表不存在与另外一个表中的记录相关的知识,希望对你有一定的参考价值。

由于数据太多,所以用not in 的方法效率很低 有没有其他的办法呢?

参考技术A 假设两个表中的关联字段是id,那么删除语句是

delete from table_a where not exists (select 'x' from table_b b where table_a.id = b.id)
参考技术B create table A_temp as select * where A.col in (select b.col from b);
drop table A;
alter table A_temp rename to A;本回答被提问者采纳

SQL Server merge用法

有两个表名:source 表和 target 表,并且要根据 source 表中匹配的值更新 target 表。

有三种情况:

  • source 表有一些 target 表不存在的行。在这种情况下,需要将 source 表中的行插入到 target 中。
  • target 表有一些 source表不存在的行。这种情况下,需要从 target 表中删除行。
  • source 表的某些行具有与 target 表中的行相同的键。但是,这些行在非键列中具有不同的值。这种情况下,需要使用来自 source 表中的值更新 target 表中的行。

下图,说明了 source 表和 target 表 的一些操作:插入,更新,删除:

技术图片

如果单独使用 INSERT, UPDATE和DELETE语句,则需要三个单独的语句,来使 source 表中的匹配行的数据更新到 target表。

但是,使用 merge 可以同时执行三个操作。下面是 merge语句的语法:

MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
    THEN update_statement
WHEN NOT MATCHED
    THEN insert_statement
WHEN NOT MATCHED BY SOURCE
    THEN DELETE;

使用示例:

CREATE TABLE sales.category (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(255) NOT NULL,
    amount DECIMAL(10 , 2 )
);

INSERT INTO sales.category(category_id, category_name, amount)
VALUES(1,Children Bicycles,15000),
    (2,Comfort Bicycles,25000),
    (3,Cruisers Bicycles,13000),
    (4,Cyclocross Bicycles,10000);


CREATE TABLE sales.category_staging (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(255) NOT NULL,
    amount DECIMAL(10 , 2 )
);


INSERT INTO sales.category_staging(category_id, category_name, amount)
VALUES(1,Children Bicycles,15000),
    (3,Cruisers Bicycles,13000),
    (4,Cyclocross Bicycles,20000),
    (5,Electric Bikes,10000),
    (6,Mountain Bikes,10000);

要使用 sales.category_staging(源表)中的值将数据更新到 sales.category(目标表),要使用 merge:

MERGE sales.category t 
    USING sales.category_staging s
ON (s.category_id = t.category_id)
WHEN MATCHED
    THEN UPDATE SET 
        t.category_name = s.category_name,
        t.amount = s.amount
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (category_id, category_name, amount)
         VALUES (s.category_id, s.category_name, s.amount)
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE;

执行过程如下图:

技术图片

 

以上是关于SQL删除一个表不存在与另外一个表中的记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server merge用法

Python支持SQL数据库返回psycopg2.ProgrammingError:在尝试删除表中的数据时,关系不存在错误?

mysql提示table不存在:把数据库里的表都删了,用sql重新建表,怎么还提示表不存在呢?是在服务器上

如果第二个表不存在连接,Mysql 使用一个表中的列值

使用 sqitch 中的 mysql 查询验证表不存在

对于除 ORA-00942 表不存在之外的所有错误,停止运行存储过程