You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条SQL语句删除两组表中键值重复的行

解决方案

可以用单条SQL语句实现,具体语法取决于你使用的数据库,以下是针对主流数据库的实现方案:

MySQL(8.0+)

方式1:批量删除(单条语句包含多个DELETE操作)

通过INTERSECT获取两组表中共同的first_name,再用IN子查询批量删除对应行:

DELETE FROM t11 WHERE first_name IN (
    SELECT first_name FROM (
        SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14
    ) t1_all
    INTERSECT
    SELECT first_name FROM (
        SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24
    ) t2_all
);
DELETE FROM t12 WHERE first_name IN (SELECT first_name FROM (SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14) t1_all INTERSECT SELECT first_name FROM (SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24) t2_all);
DELETE FROM t13 WHERE first_name IN (SELECT first_name FROM (SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14) t1_all INTERSECT SELECT first_name FROM (SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24) t2_all);
DELETE FROM t14 WHERE first_name IN (SELECT first_name FROM (SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14) t1_all INTERSECT SELECT first_name FROM (SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24) t2_all);
DELETE FROM t21 WHERE first_name IN (SELECT first_name FROM (SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14) t1_all INTERSECT SELECT first_name FROM (SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24) t2_all);
DELETE FROM t22 WHERE first_name IN (SELECT first_name FROM (SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14) t1_all INTERSECT SELECT first_name FROM (SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24) t2_all);
DELETE FROM t23 WHERE first_name IN (SELECT first_name FROM (SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14) t1_all INTERSECT SELECT first_name FROM (SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24) t2_all);
DELETE FROM t24 WHERE first_name IN (SELECT first_name FROM (SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14) t1_all INTERSECT SELECT first_name FROM (SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24) t2_all);

方式2:严格单条语句(无分号分隔)

通过LEFT JOIN关联所有表和共同first_name集合,一次性删除匹配行:

DELETE t11, t12, t13, t14, t21, t22, t23, t24
FROM (
    SELECT first_name FROM (
        SELECT first_name FROM t11 UNION ALL SELECT first_name FROM t12 UNION ALL SELECT first_name FROM t13 UNION ALL SELECT first_name FROM t14
    ) t1_all
    INTERSECT
    SELECT first_name FROM (
        SELECT first_name FROM t21 UNION ALL SELECT first_name FROM t22 UNION ALL SELECT first_name FROM t23 UNION ALL SELECT first_name FROM t24
    ) t2_all
) AS common_names
LEFT JOIN t11 ON t11.first_name = common_names.first_name
LEFT JOIN t12 ON t12.first_name = common_names.first_name
LEFT JOIN t13 ON t13.first_name = common_names.first_name
LEFT JOIN t14 ON t14.first_name = common_names.first_name
LEFT JOIN t21 ON t21.first_name = common_names.first_name
LEFT JOIN t22 ON t22.first_name = common_names.first_name
LEFT JOIN t23 ON t23.first_name = common_names.first_name
LEFT JOIN t24 ON t24.first_name = common_names.first_name;

PostgreSQL

使用WITH子句预先定义共同的first_name集合,链式执行所有表的删除操作:

WITH common_names AS (
    SELECT first_name FROM (
        SELECT first_name FROM t11 UNION ALL
        SELECT first_name FROM t12 UNION ALL
        SELECT first_name FROM t13 UNION ALL
        SELECT first_name FROM t14
    ) t1_all
    INTERSECT
    SELECT first_name FROM (
        SELECT first_name FROM t21 UNION ALL
        SELECT first_name FROM t22 UNION ALL
        SELECT first_name FROM t23 UNION ALL
        SELECT first_name FROM t24
    ) t2_all
),
del_t11 AS (DELETE FROM t11 WHERE first_name IN (SELECT * FROM common_names)),
del_t12 AS (DELETE FROM t12 WHERE first_name IN (SELECT * FROM common_names)),
del_t13 AS (DELETE FROM t13 WHERE first_name IN (SELECT * FROM common_names)),
del_t14 AS (DELETE FROM t14 WHERE first_name IN (SELECT * FROM common_names)),
del_t21 AS (DELETE FROM t21 WHERE first_name IN (SELECT * FROM common_names)),
del_t22 AS (DELETE FROM t22 WHERE first_name IN (SELECT * FROM common_names)),
del_t23 AS (DELETE FROM t23 WHERE first_name IN (SELECT * FROM common_names))
DELETE FROM t24 WHERE first_name IN (SELECT * FROM common_names);

内容的提问来源于stack exchange,提问作者Yanxin Xiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:05:55