SQL-запрос - узлы вниз
У меня есть следующие 3 таблицы, которые я хотел бы выполнить SQL-запрос, чтобы найти, какие узлы имеют все свои интерфейсы вниз... который из таблицы ниже является узел x2, потому что (узел присутствует в таблице 'отключение' и количество интерфейсов равно 2 в таблице "отключение" и "интерфейс").
node
id name
1 x1
2 x2
3 x3
outage
id nodeid ip duration
1 1 1.1.1.1 1h
2 2 2.2.2.1 2h
2 2 2.2.2.2 2h
3 3 3.3.3.1 5h
interface
id nodeid ip
1 1 1.1.1.1
1 1 1.1.1.2
1 1 1.1.1.3
2 2 2.2.2.1
2 2 2.2.2.2
3 3 3.3.3.1
3 3 3.3.3.2
3 3 3.3.3.3
3 3 3.3.3.4
Я пытался написать много запросов SQL, но не удалось. Я имею в виду псевдокод в следующем:
если "узел присутствует в таблице сбоев" и если "количество интерфейсов в таблице сбоев = количество интерфейсов в таблице интерфейсов, то узел считается неработающим. иначе узел либо работает, либо один или многие из его интерфейсов не работают.
любая мысль или идея о том, как подойти к этому вопросу!
PS Использование PostgreSQL
1 ответ
Самый простой способ сделать это - проверить, нет ли у узла интерфейса, который не выключен.
SELECT *
FROM node AS n
WHERE
NOT EXISTS(
SELECT *
FROM interface AS i
LEFT JOIN outage AS o
ON (i.nodeid,i.ip) = (o.nodeid,o.ip)
WHERE i.nodeid = n.id AND o.id IS NULL
)