6
回答
mysql两表联合查询,两个表结构一样,多个字段中的3个字段只要有一个相同就算重复,求不重复记录?
极速云服务器,低至1.04元/天>>>   

a表与b表字段都是相同的,字段为:
险种,车牌,发动机号,车大架号
现在想实现的是:
只要a表的险种与b表的险种相同,并且a表的车牌,发动机号,车大架号与b表的车牌,发动机号,车大架号只要3个中的一个相同,则就算重复。
想要的是显示a表或者b表中不重复的记录。
a表创建及记录:

DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
  `xianzhong` varchar(30) DEFAULT NULL,
  `chepai` varchar(20) DEFAULT NULL,
  `fadongji` varchar(30) DEFAULT NULL,
  `chejiahao` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
INSERT INTO `a` VALUES ('DAA','吉B3120挂','','');
INSERT INTO `a` VALUES ('DZA','吉B3120挂','','');
INSERT INTO `a` VALUES ('DAA','','ABCD','');
INSERT INTO `a` VALUES ('DAA','吉B3146挂','','');
INSERT INTO `a` VALUES ('DZA','吉B3146挂','','');
INSERT INTO `a` VALUES ('DAA','','DSDFAA','CHEJIA1222');
INSERT INTO `a` VALUES ('DZA','吉B12231','','');
b表创建及记录:
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `xianzhong` varchar(30) DEFAULT NULL,
  `chepai` varchar(20) DEFAULT NULL,
  `fadongji` varchar(30) DEFAULT NULL,
  `chejiahao` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
INSERT INTO `b` VALUES ('DAA','吉B3120挂','','LH9B3G40090HHT174');
INSERT INTO `b` VALUES ('DZA','吉B3120挂','','LH9B3G40090HHT174');
INSERT INTO `b` VALUES ('DAA','吉B12345','','1345');
INSERT INTO `b` VALUES ('DAA','吉B3146挂','','LH9B3G40990HHT173');
INSERT INTO `b` VALUES ('DZA','吉B3146挂','','LH9B3G40990HHT173');
INSERT INTO `b` VALUES ('DAA','吉B35623','','');
INSERT INTO `b` VALUES ('DAA','','FDFGS','');

a表


b表

 想要的a表的结果如下:

举报
于洋
发帖于6年前 6回/3K+阅
共有6个答案 最后回答: 6年前
select A.* from A where not exisit (select * from B wehre A.xianzhong=B.xianzhong and ((A.chepai=B.chepai and A.chepai<>'') or (A.fadongji=B.fadongji and A.fadongji<>'') or (A.chejiahao=B.chejiahao and A.chejiahao<>'')))
--- 共有 4 条评论 ---
于洋SORRY 6年前 回复
泡不烂的凉粉回复 @于洋 : "为什么提示出错" 如果你提问这样的问题,我想以后我是不会回复这样的问题的。 6年前 回复
泡不烂的凉粉回复 @于洋 : 给你的是思路。 我又不是你的应用测试人员。 6年前 回复
于洋为什么提示出错呢 6年前 回复

你还是没搞懂 NULL 和 ''  的区别。
那些算重复? 那些算不重复? 看你的例子,似乎,险种和车牌相同并且不是''就算重复。否则不重复。

select A.* from A where not exisit (select * from B where A.xianzhong=B.xianzhong AND A.chepai=B.chepai) OR A.chepai='';

--- 共有 5 条评论 ---
泡不烂的凉粉回复 @于洋 : 如果 ''内容为 NULL 那么楼下的语句就可以完成任务了。 6年前 回复
于洋那我''都改为NULL呢 能查询出来不 6年前 回复
泡不烂的凉粉回复 @于洋 : 那你结果就不存在, 因为 车牌='' 的记录在表B中存在。 6年前 回复
于洋fadongji chejiahao也要算在内 只要这3个有一个相同就算重复 6年前 回复
于洋你说的NULL和''的区别我懂 6年前 回复

select * from a,b where a.xianzhong!=b.xianzhong or (a.xianzhong=b.xianzhong and a.chepai!=b.chepai and a.fadongji!=b.fadongji and a.chejiahao!=b.chejiahao)我没试 大致就是这思路吧 你试试

--- 共有 1 条评论 ---
于洋你这个查询出来30多个记录 不是我想要的 6年前 回复
回复 @于洋 : 其实,像这样的应用。 在实际生活中。不存在''的例子,因为这个行业要求存在,他们的数据也肯定存在, 只是录入的时候不知道。 所以数据应该标记成null . 某些类型的数据,确定是没有。那才可以是'' NULL 和''是不同的概念,如果你需要一些不需要数据的 数据项可以用 select * from f1=''; 来快速找到。如果你需要找写不知道的数据项你可以用 select * from f1 is NULL; 来快速找到。这个是数据库设计的时候应该考虑的问题。
--- 共有 1 条评论 ---
于洋受教了 感谢 6年前 回复
回复 @于洋 : select DISTINCT a.* from a,b where a.xianzhong!=b.xianzhong OR (a.xianzhong=b.xianzhong and a.chepai!=b.chepai and a.fadongji!=b.fadongji and a.chejiahao!=b.chejiahao) ; select DISTINCT b.* from a,b where a.xianzhong!=b.xianzhong OR (a.xianzhong=b.xianzhong and a.chepai!=b.chepai and a.fadongji!=b.fadongji and a.chejiahao!=b.chejiahao)
我就是说是一个思路嘛,你加个distinct不就行了吗,你看这是不是你要的,如果不是只能说我对你的问题没有理解,或者你说的和你想要的不是一样的,你再试一下。
SELECT f.* FROM(
SELECT d.* FROM(
SELECT c.* from (SELECT * from a UNION SELECT * FROM b) as c GROUP BY CONCAT(c.xianzhong,c.chepai)
        ) AS d GROUP BY CONCAT(d.xianzhong,d.fadongji)
        ) AS f GROUP BY CONCAT(f.xianzhong,f.chejiahao)
顶部