使用复合主键的 RIGHT JOIN 不检索所有数据
RIGHT JOIN with composite primary key not retrieving all data
我有一个 MySQL 数据库来存储一些设备 IP 地址、供应商和服务状态,其结构如下(已简化以供说明):
- Table 设备 (id, ipaddress) 作为主键
id ipaddress name
1234 10.20.30.40 NY Router
1234 10.31.41.51 DC Router
2222 10.255.99.22 CA Router
- Table 供应商
id name
1 Cisco
2 Juniper
3 Huawei
- Table equipment_vendor
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)关于设备table,以前pk只是id,但是我不得不加上ipaddress,因为我发现不同的设备id相同但ip地址不同。
2) 我现在 vendor 可以是设备列而不是关联 table。仅供演示之用。
问题:
如上图,不知为何,equipment_vendortable中有旧记录,但设备table中已无相关记录(如上面id=4的记录) , 设备中没有 2222-10.255.99.20 table)。
然后我需要在相同情况下取回所有设备。我做到了:
SELECT * FROM equipment AS a
RIGHT JOIN equipment_vendor AS b ON a.id = b.equipment_id AND a.ipaddress = b.equipment_ipaddress
这只给我显示了"existent"个装备,但我需要的恰恰相反,我需要的是不存在的。我认为 RIGHT JOIN 函数就是为了做到这一点,即使左边没有关联的记录,也可以从右边 table 获取所有内容。我错了吗?
我尝试了每种类型的连接并尝试颠倒顺序(equipment_vendor 连接设备)。
我希望你能帮助我。谢谢。
尝试
NOT IN
SELECT ev.equipment_id, ev.equipment_ipaddress FROM equipment_vendor ev WHERE ev.equipment_ipaddress NOT IN (SELECT eq.ipaddress FROM equipment eq);
使用 NOT EXISTS
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)
我有一个 MySQL 数据库来存储一些设备 IP 地址、供应商和服务状态,其结构如下(已简化以供说明):
- Table 设备 (id, ipaddress) 作为主键
id ipaddress name 1234 10.20.30.40 NY Router 1234 10.31.41.51 DC Router 2222 10.255.99.22 CA Router
- Table 供应商
id name 1 Cisco 2 Juniper 3 Huawei
- Table equipment_vendor
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)关于设备table,以前pk只是id,但是我不得不加上ipaddress,因为我发现不同的设备id相同但ip地址不同。
2) 我现在 vendor 可以是设备列而不是关联 table。仅供演示之用。
问题: 如上图,不知为何,equipment_vendortable中有旧记录,但设备table中已无相关记录(如上面id=4的记录) , 设备中没有 2222-10.255.99.20 table)。 然后我需要在相同情况下取回所有设备。我做到了:
SELECT * FROM equipment AS a
RIGHT JOIN equipment_vendor AS b ON a.id = b.equipment_id AND a.ipaddress = b.equipment_ipaddress
这只给我显示了"existent"个装备,但我需要的恰恰相反,我需要的是不存在的。我认为 RIGHT JOIN 函数就是为了做到这一点,即使左边没有关联的记录,也可以从右边 table 获取所有内容。我错了吗? 我尝试了每种类型的连接并尝试颠倒顺序(equipment_vendor 连接设备)。
我希望你能帮助我。谢谢。
尝试
NOT IN
SELECT ev.equipment_id, ev.equipment_ipaddress FROM equipment_vendor ev WHERE ev.equipment_ipaddress NOT IN (SELECT eq.ipaddress FROM equipment eq);
使用 NOT EXISTS
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)