2013-11-13 5 views
1

У меня есть (Postgres) SQL таблицу, которая имеет следующее содержание (хостов):SQL присоединиться только если нет матча

ip_address | mac_address | hostname | device | physical_port 
----------------+----------------+----------+--------+--------------- 
111.111.111.111 | aaaa.aaaa.aaaa | hosta | swh-a | Gi1/1 
111.111.111.112 | bbbb.bbbb.bbbb | hostb | swh-b | Gi2/1 
111.111.111.113 | cccc.cccc.cccc | hostc | swh-c | Gi3/1 

У меня есть еще одна таблица (Peers), который содержит точка-точка ссылки между devices в умелой таблице.

device | physical_port | peer_device | peer_physical_port 
-------+---------------+-------------+----------------------+ 
swh-a | Gi1/20  | swh-b  | Gi2/1 
swh-b | Gi2/1   | swh-a  | Gi1/20 
swh-b | Gi2/1   | swh-c  | Gi3/1 
swh-c | Gi3/1   | swh-b  | Gi2/1 

В принципе, я хотел бы, чтобы исключить записи из таблицы Уникальных, которые содержатся в таблице пэров таким образом, что я только получаю:

ip_address | mac_address | hostname | device | physical_port 
----------------+----------------+----------+--------+--------------- 
111.111.111.111 | aaaa.aaaa.aaaa | hosta | swh-a | Gi1/1 

(учитывая, что device=swh-b physical_port=Gi2/1 и device=swh-c physical_port=Gi3/1 существуют в пределах Таблица сверстников).

ответ

0

Вам нужно что-то вроде этого:

SELECT * 
FROM Host h 
LEFT JOIN Peers p ON p.device= h.device and p.physical_port = h.physical_port 
WHERE p.ID IS NULL 
1

ли эта работа для вас?

SELECT * FROM Hosts 
WHERE NOT peer_physical_port IN (
    SELECT DISTINCT peer_physical_port FROM Peers 
) 

Вы выбираете только те записи, которые не отображаются во второй таблице.

3

Вы можете использовать NOT EXISTS для самостоятельной пояснительной запросы, который читает почти как если бы это было на английском языке:

SELECT * 
FROM Hosts h 
WHERE NOT EXISTS (
    SELECT * FROM Peers p 
    WHERE p.peer_device = h.device AND p.peer_physical_port = h.physical_port 
) 
0

Попробуйте это ..

SELECT * 
FROM Host 
WHERE device NOT IN (SELECT device FROM Peers) 
AND  physical_port NOT IN (SELECT physical_port FROM Peers) 
Смежные вопросы