【问题标题】:RIGHT JOIN with composite primary key not retrieving all data使用复合主键的 RIGHT JOIN 未检索所有数据
【发布时间】:2018-10-06 13:04:36
【问题描述】:

我有一个 MySQL 数据库来存储一些设备 IP 地址、供应商和服务状态,结构如下(为了说明而简化):

  • 设备(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
  • 供应商
  id      name    
  1       Cisco
  2       Juniper
  3       Huawei
  • 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)关于设备表,以前pk只是id,但我必须包括ipaddress,因为我发现不同的设备具有相同的id但不同的ip地址。

2) 我现在那个 vendor 可以是一列设备而不是一个关联表。仅用于演示目的。

问题: 如上图,不知什么原因,device_vendor 表中存在旧记录,但设备表中没有相关记录(如上面记录 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 函数旨在做到这一点,即使左侧表中没有关联记录,也可以从右侧表中获取所有内容。我错了吗? 我尝试了每种类型的连接并尝试反转顺序(equipment_vendor 连接设备)。

我希望你能帮助我。谢谢。

【问题讨论】:

    标签: mysql composite-primary-key right-join


    【解决方案1】:

    试试

    不在

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

    【讨论】:

    • :D 我觉得我生疏了。谢谢
    【解决方案2】:

    使用不存在

    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)
    

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 1970-01-01
      • 2021-03-25
      • 2012-07-25
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      相关资源
      最近更新 更多