ПРАВИЛЬНОЕ СОЕДИНЕНИЕ с составным первичным ключом, не получающим все данные - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть база данных 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) О таблице оборудования, в прошлом ПК был толькоидентификатор, но мне пришлось включить IPaddress, потому что я выяснил, другое оборудование с тем же идентификатором, но с другим IP-адресом.

2) Теперь я могу сказать, что поставщиком может быть столбец оборудования вместо ассоциативной таблицы.Это только для демонстрационных целей.

Проблема: Как показано выше, по неизвестной причине в таблице equipment_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 join equipment).

Надеюсь, вы поможете мне с этим.Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Использовать НЕ СУЩЕСТВУЕТ

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)
0 голосов
/ 26 апреля 2018

try

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);
...