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

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

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

  1. id ipaddress name
  2. 1234 10.20.30.40 NY Router
  3. 1234 10.31.41.51 DC Router
  4. 2222 10.255.99.22 CA Router

表供应商

  1. id name
  2. 1 Cisco
  3. 2 Juniper
  4. 3 Huawei

表设备供应商

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

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

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

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

w51jfk4q

w51jfk4q1#

尝试
歪投球

  1. 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#

使用不存在

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

相关问题