右连接复合主键不检索所有数据

rqmkfv5c  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(326)

我有一个mysql数据库来存储一些设备ip地址、供应商和服务状态,其结构如下(为了便于说明而简化):
表设备(id、IP地址)作为主键

id    ipaddress       name
1234  10.20.30.40     NY Router
1234  10.31.41.51     DC Router
2222  10.255.99.22    CA Router

表供应商

id      name    
  1       Cisco
  2       Juniper
  3       Huawei

表设备供应商

id    equipment_id    equipment_ipaddress     vendor_id
1     1234            10.20.30.40             1
2     1234            10.31.41.51             1
3     2222            10.255.99.22            2
4     2222            10.255.99.20            2

笔记:
1) 关于设备表,过去的pk只是id,但是我必须包含ipaddress,因为我发现不同的设备具有相同的id但是不同的ip地址。
2) 我现在知道供应商可以是一列设备,而不是一个关联表。这只是为了说明目的。
问题:如上所示,由于某种未知原因,设备\供应商表中存在旧记录,但设备表中不再有相关记录(如上面的记录id=4,设备表中没有2222-10.255.99.20)。然后我需要在同样的情况下取回所有的设备。我做到了:

SELECT * FROM equipment AS a
RIGHT JOIN equipment_vendor AS b ON a.id = b.equipment_id AND a.ipaddress = b.equipment_ipaddress

这只向我展示了“存在的”设备,但我需要的恰恰相反,我需要的是不存在的设备。我以为right join函数就是要这样做的,从右边的表中获取所有数据,即使左边的表中没有相关的记录。我错了吗?我尝试了各种类型的连接,并尝试反转顺序(设备\供应商连接设备)。
我希望你能帮我。谢谢。

w51jfk4q

w51jfk4q1#

尝试
歪投球

SELECT ev.equipment_id, ev.equipment_ipaddress FROM equipment_vendor ev WHERE ev.equipment_ipaddress NOT IN (SELECT eq.ipaddress FROM equipment eq);
x759pob2

x759pob22#

使用不存在

SELECT * 
FROM equipment_vendor ev 
WHERE NOT EXISTS(SELECT 1 FROM equipment eq 
                 WHERE eq.id = ev.equipment_id
                 AND eq.ipaddress = ev.equipment_ipaddress)

相关问题