J'ai une vue A
et une vue B
.
Dans A
j'ai beaucoup d'informations sur certains systèmes, comme IP
et port
que je veux tout conserver. Dans B
j'ai juste une information que je veux ajouter à A
.
Les champs correspondants entre les deux vues sont IP
et Port
. Je dois donc faire correspondre les hôtes qui ont la même IP et le même port dans les deux vues.
Exemples:
IP | OS | Hostname | Port | Protocol
1 | Win | hostONE | 80 | tcp
1 | Win | hostONE | 443 | tcp
1 | Win | hostONE | 8080 | tcp
2 | Linux | hostTWO | 21 | tcp
2 | Linux | hostTWO | 80 | tcp
3 | Linux | hostTR | 22 | tcp
IP | Port | State
1 | 443 | Open
2 | 80 | Closed
IP | OS | Hostname | Port | Protocol | State
1 | Win | hostONE | 80 | tcp |
1 | Win | hostONE | 443 | tcp | Open
1 | Win | hostONE | 8080 | tcp |
2 | Linux | hostTWO | 21 | tcp | Closed
2 | Linux | hostTWO | 80 | tcp |
3 | Linux | hostTR | 22 | tcp |
Remarque: il est possible que certains hôtes de la vue A n'aient aucun élément lié à l'IP/port dans la vue B.
Il est également possible que certains hôtes de la vue A aient une correspondance dans la vue B.
J'ai pensé que je devrais utiliser LEFT JOIN pour avoir toutes les entrées de la vue A et la bonne entrée associée de la vue B, mais cela n'a pas fonctionné. Je ne suis pas en mesure d'ajuster la requête avec la bonne clause WHERE et la solution JOIN.
Une idée?
select a.ip, a.os, a.hostname, a.port, a.protocol,
b.state
from a
left join b on a.ip = b.ip
and a.port = b.port
Essayons de cette façon:
select
a.ip,
a.os,
a.hostname,
a.port,
a.protocol,
b.state
from a
left join b
on a.ip = b.ip
and a.port = b.port /*if you has to filter by columns from right table , then add this condition in ON clause*/
where a.somecolumn = somevalue /*if you have to filter by some column from left table, then add it to where condition*/
Ainsi, dans la clause where
, vous pouvez filtrer le jeu de résultats par colonne de la table de droite uniquement de cette façon:
...
where b.somecolumn <> (=) null