【问题标题】:I need the records which doesn't matches in both tables我需要两个表中都不匹配的记录
【发布时间】:2019-06-19 19:48:15
【问题描述】:

我需要一个表列表中的那些记录,它不链接到表 t1 到表 t2

我已经尝试过内部连接。我需要没有子查询的记录

CREATE TABLE t1 (
    id INT PRIMARY KEY
);

CREATE TABLE t2 LIKE t1;

INSERT INTO t1(id) VALUES(1),(2),(3);

INSERT INTO t2(id) VALUES(2),(3),(4);

mysql> select * from t1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.01 sec)

mysql> select * from t2;
+----+
| id |
+----+
|  2 |
|  3 |
|  4 |
+----+
3 rows in set (0.00 sec)

我需要:

+----+
| id |
+----+
|  1 |
|  4 |
+----+

【问题讨论】:

  • (显然--)这是一个常见问题。在考虑发布之前,请始终在谷歌上搜索任何错误消息以及您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括和不包括您的特定字符串/名称;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。当您提出问题时,请展示您尝试和研究过的内容。

标签: mysql join


【解决方案1】:

您可以尝试在 id 的并集上进行左连接并检查是否为 null

select  t3.id  
from  (
  select  t1.id from t1 
  union 
  select t2.id  from t2 
) t3 
left join t1 on t1.id  = t3.id 
left join t2. on t2.id  = t3.id 
where t2.id is null  
or t1.id is null 

【讨论】:

  • 您已经使用子查询创建了一个临时表。请在没有子查询的情况下解决。如果每个表有 10 万条记录会怎样。
  • @Er.SujeetKumar SO 不是免费编码服务 .. 而是一个问答网站 .. 根据您的问题,我的回答是正确的解决方案 .. .. 您不想要 subuery ..那么你应该找到一种方法来获取第b9个表的所有ID并加入表本身..我认为联合是你最简单的方法
【解决方案2】:

select * from t1 where not exists (select * from t2 where t1.id = t2.id)

select * from t1 where id not in (select id from t2)

对于 t2 也是如此。如果您希望将它们合并到一个结果集中,请将它们合并在一起。

更新:无子查询版本:

select coalesce(t1.id, t2.id) from t1 full outer join t2 on (t1.id = t2.id)
where t1.id is null or t2.id is null

【讨论】:

  • 谢谢。第一个查询的评论:但我不想使用子查询。第二个查询的注释:条件语句中有一个限制。
  • 抱歉,错过了。我添加了一个不使用子查询的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多