左外部联接,从左查找所有没有出现在右表,mysql

时间:2019-06-13 21:38:54

标签: mysql

我有两个表,一个映射和一个数据表,我想查找所有没有任何关联数据的映射

例如:

     map                 data
============        ===============
mapId | name         mapId | value
------------        ---------------
  1      A             1       x
  2      B             1       y
  3      C             2       z

在这种情况下,我想返回mapId 3 / C,因为它存在于地图表中,但在数据表中没有记录

如何查询?我已经尝试了每个组的组合,并且在我能想到的地方,最接近的是

SELECT map.name
FROM map
LEFT OUTER JOIN data on data.mapId = map.mapId
GROUP BY data.mapId
HAVING max(data.value) is null

我还尝试通过map.mapId进行分组,并让count(data.dataId)= 0,但都无济于事。无论我如何设置,我都会得到一些确实有数据的地图,或者得不到一些没有数据的地图。

2 个答案:

答案 0 :(得分:1)

无需分组,左联接就足够了:

SELECT map.*
FROM map LEFT JOIN data 
on data.mapId = map.mapId
WHERE data.mapId is null

使用NOT EXISTS的另一种方法:

SELECT map.*
FROM map  
WHERE NOT EXISTS (
  SELECT 1 FROM data 
  WHERE data.mapId = map.mapId
)

答案 1 :(得分:1)

您不需要group by即可实现。我添加了mapId的数据中,一个distinct可能有多行。

select
    distinct m.mapId, m.name
from map m
left join data d
    on m.mapId = d.mapId
where d.mapId is null