it-swarm.com.de

SQL LEFT-JOIN auf 2 Feldern für MySQL

Ich habe eine Ansicht A und eine Ansicht B.

In A habe ich viele Informationen über einige Systeme, wie IP und port, die ich alle beibehalten möchte. In B habe ich nur eine Information, die ich unter A hinzufügen möchte.

Die übereinstimmenden Felder zwischen den beiden Ansichten sind IP und Port. Ich muss also die Hosts zuordnen, die in beiden Ansichten dieselbe IP und denselben Port haben.

Beispiele:

Ansicht A:

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

Ansicht B:

IP | Port | State
1  | 443  | Open
2  | 80   | Closed

AUSGABE

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      |

Hinweis: Möglicherweise haben einige Hosts der Ansicht A keine IP/Port-bezogenen Elemente in Ansicht B.

Es ist auch möglich, dass einige Hosts der Ansicht A eine Übereinstimmung in der Ansicht B haben.

Ich dachte, dass ich LEFT JOIN verwenden sollte, um den gesamten Eintrag von Ansicht A und den korrekten zugeordneten Eintrag von Ansicht B zu haben, aber es funktionierte nicht. Ich kann die Abfrage nicht mit der richtigen WHERE-Klausel und der richtigen JOIN-Lösung anpassen.

Irgendeine Idee?

21
Possa
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
53
juergen d

Lass es uns so versuchen:

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*/

In der where -Klausel können Sie die Ergebnismenge nur auf folgende Weise nach Spalten aus der rechten Tabelle filtern:

...
where b.somecolumn <> (=) null
5
veljasije