Сделайте SQL-запрос к трем таблицам с предложением NOT-LIKE - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужно извлечь все серверы, которые не входят в указанную группу. У меня есть 3 таблицы: хост (содержит хосты), hostgroup_relation (содержит идентификатор хоста и идентификатор группы хостов), группа хостов (содержит группы хостов)

Я могу получить отношения, но мне нужны все хосты, которые НЕ являются членами группы с идентификатором 180

Ведущий:

SELECT host_id,host_name FROM host LIMIT 10;
+---------+-------------------+
| host_id | host_name         |
+---------+-------------------+
|    1482 | AADSYNC1          |
|     442 | Acces-Point-Wifi  |
|    1916 | ADAUDIT1          |
|    1562 | ADMORA1           |
|    2247 | ADMRDS2           |
|    2226 | ADSECU1           |
|    1203 | ADSELFSERVICE1    |
|    1172 | ALFRESCO1         |
|    1841 | ALFRESCO2         |
|     172 | Antispam-Ironport |
+---------+-------------------+

группы узлов сети:

SELECT hg_id, hg_name FROM hostgroup LIMIT 10
+-------+----------------------+
| hg_id | hg_name              |
+-------+----------------------+
|    82 | Antivirus-Trend      |
|    65 | Autocoms             |
|    72 | Baies-de-stockage    |
|    78 | Consoles             |
|   192 | Databases-All        |
|   193 | Databases-Main       |
|    68 | Databases-MySql      |
|    67 | Databases-Oracle     |
|   181 | Databases-PostgreSql |
|    69 | Databases-SQLServer  |
+-------+----------------------+

Отношение хост / группа хостов:

SELECT * FROM hostgroup_relation LIMIT 10;
+--------+-----------------+--------------+
| hgr_id | hostgroup_hg_id | host_host_id |
+--------+-----------------+--------------+
|   5698 |              70 |         1167 |
|   6772 |              53 |         1167 |
|   6820 |             144 |         1369 |
|   6821 |              62 |         1369 |
|   6822 |              53 |         1369 |
|   6823 |              70 |         1369 |
|   6825 |              62 |         1370 |
|   6826 |              53 |         1370 |
|   6827 |              70 |         1370 |
|   6829 |              62 |         1371 |
+--------+-----------------+--------------+

Вот куда я дошел:

SELECT host.host_name, hostgroup.hg_name
FROM host, hostgroup_relation, hostgroup
WHERE hostgroup_relation.hostgroup_hg_id = hostgroup.hg_id
    AND hostgroup_relation.host_host_id = host.host_id
LIMIT 10;
+-----------+-----------------------------+
| host_name | hg_name                     |
+-----------+-----------------------------+
| AADSYNC1  | Default-bi                  |
| AADSYNC1  | Serveurs-Virtuels           |
| AADSYNC1  | Serveurs-Windows            |
| AADSYNC1  | Reboot_serveurs-12h00:14h00 |
| ADAUDIT1  | Default-bi                  |
| ADAUDIT1  | Serveurs-Virtuels           |
| ADAUDIT1  | Serveurs-Windows            |
| ADAUDIT1  | Reboot_serveurs-12h00:14h00 |
| ADMORA1   | Default-bi                  |
| ADMORA1   | Reboot_serveurs-00h00:4h00  |
+-----------+-----------------------------+

И мне нужен список всех серверов, которые не входят в указанную группу.

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Вам нужно сделать простое соединение.

Это может сработать:

SELECT h.host_id, h.host_name
FROM host h
LEFT OUTER JOIN hostgroup_relation hgr ON (hgr.host_host_id = h.host_id AND hgr.hostgroup_hg_id = 180)
WHERE hgr.hgr_id IS NULL
0 голосов
/ 08 апреля 2019

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

    select h.host_id, hg.host_name, hg.hg_id
    from host h
    join hostgroup_relation hg
    where h.host_id = hg.host_host_id
    and hg_id not in 180;
...