web-dev-qa-db-ja.com

MySQLの2つのフィールドでのSQL LEFT-JOIN

ビューAとビューBがあります。

Aには、すべてを保存したいIPportなど、いくつかのシステムに関する多くの情報があります。 Bには、Aに追加したい情報が1つだけあります。

2つのビュー間で一致するフィールドは、IPPortです。したがって、両方のビューで同じIPとポートを持つホストを一致させる必要があります。

例:

ビュー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

ビューB:

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      |

注:ビューAの一部のホストには、ビューBにIP /ポート関連の項目がない場合があります。

ビューAの一部のホストがビューBで一致する可能性もあります。

ビューAのすべてのエントリとビューBの正しい関連エントリを取得するには、LEFT JOINを使用する必要があると考えましたが、機能しませんでした。適切なWHERE句とJOINソリューションを使用してクエリを調整することはできません。

何か案が?

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

この方法を試してみましょう:

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

したがって、where句では、次の方法でのみ、右側のテーブルの列で結果セットをフィルタリングできます。

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