项目的数据库从Oracle更换到了MySQL,导致很多sql需要重写,其中有一个sql是需要求两个结果的差集(不要问我为什么不在Java代码里处理,问就是老板不让这么干),百度到一个大佬的文章,其中分析的很到位,但是那个sql在实际使用中有一定的局限性,个人认为它实际上并不是完全的求差集(如果左表有部分数据在右表没有的话,则这一部分数据查不出来,可能有些大佬说不可能存在这种情况,那可能是你的业务没有涉及到),sql语句和链接我也会贴在文末,有感兴趣的大佬可以去看看;另外本文的sql执行效率在数据量比较大的情况下也没有验证过,如果有哪位大佬有条件,可以验证一下告知一下小弟;
- 先来创建两个表和数据
CREATE TABLE `test1` ( `id` int NOT NULL, `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, `age` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE `test2` ( `id` int NOT NULL, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `age` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; INSERT INTO `test`.`test1` (`id`, `name`, `age`) VALUES (1, 't11', 10); INSERT INTO `test`.`test1` (`id`, `name`, `age`) VALUES (2, 't12', 11); INSERT INTO `test`.`test1` (`id`, `name`, `age`) VALUES (3, 't13', 12); INSERT INTO `test`.`test2` (`id`, `name`, `age`) VALUES (1, 't21', 20); INSERT INTO `test`.`test2` (`id`, `name`, `age`) VALUES (4, 't24', 24); INSERT INTO `test`.`test2` (`id`, `name`, `age`) VALUES (5, 't25', 25);
- 根据数据分析,那么差集应该是id等于2,3,4,5的数据
- 直接查出各自缺的那部分,再UNION合并即可
以上就是获取两个差集的整个过程了,如果有哪位大佬有更好的思路,欢迎指正;SELECT t1.* FROM test1 t1 LEFT JOIN test2 t2 ON t1.id = t2.id WHERE t2.id IS NULL UNION SELECT t2.* FROM test1 t1 right JOIN test2 t2 ON t1.id = t2.id WHERE t1.id IS NULL
以下是另一位大佬的求差集的sql和链接,有兴趣的朋友可以去看看;
【Mysql】求两个表(查询结果)的差集_编程记录,亲测有效-CSDN博客_mysql求差集select id FROM usertable LEFT JOIN (select id as i from blog) as t1 ON usertable.id=t1.i where t1.i IS NULL