用sql查找表之间不匹配的行

Posted

技术标签:

【中文标题】用sql查找表之间不匹配的行【英文标题】:Find unmatched rows between tables with sql 【发布时间】:2016-02-10 17:19:34 【问题描述】:

我正在尝试使用 SQL 查找 2 个表之间的所有不匹配行。 表codes 包含600 万个条目,表burnt 包含100 万个条目。 我曾尝试使用INSERT INTO SELECT,但这不起作用,它在一段时间后崩溃了。

INSERT INTO unburnt
SELECT
    *
FROM
    codes T2
WHERE
    NOT EXISTS (SELECT *
        FROM
           burnt T1
        WHERE
           T1.code = T2.code)

应将任何不匹配的行放入unburnt 表中。 处理此查询的最佳方法是什么?

3 个表的数据库表结构相同。

代码

身份证 代码(文本)

烧毁

身份证 代码(文本)

未燃烧

身份证 代码(文本)

【问题讨论】:

能否发一下相关的表结构(create table code)? @SubrataDeyPappu 我已经编辑了问题以包含表格结构 左连接代码烧毁union左连接烧毁代码,因为mysql不支持完全外连接。 你有什么索引? 试试这个方法:INSERT INTO unburnt select a.id, a.text from codes a LEFT JOIN burnt b on a.id = b.id WHERE b.id IS NULL 【参考方案1】:

尝试将 INSERT 分成一组较小的 INSERTS:

INSERT INTO unburnt SELECT * ....  WHERE T1.code = T2.code and T2.ID between 1 and 100000) 
INSERT INTO unburnt SELECT * ....  WHERE T1.code = T2.code and T2.ID between 100001 and 200000)
etc.

【讨论】:

你提出了一个很好的观点。我在想我可以使用 php 逐行插入,每次不匹配时插入。我很想看看是否有办法用 sql 处理这种事情

以上是关于用sql查找表之间不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

无论如何,为了提高 SQL 查询的性能,以按标签匹配计数查找具有顺序的行

选择同一表 SQL 中两列之间存在一对一匹配的行

3.05 在一个表中查找与其他表不匹配的记录

SQL JOIN 查询返回我们在连接表中没有找到匹配项的行

将不匹配的查找行插入表后如何继续该过程?

如何在 Oracle SQL 中查找最具体的匹配行