ビューA
とビューB
があります。
A
には、すべてを保存したいIP
やport
など、いくつかのシステムに関する多くの情報があります。 B
には、A
に追加したい情報が1つだけあります。
2つのビュー間で一致するフィールドは、IP
とPort
です。したがって、両方のビューで同じIPとポートを持つホストを一致させる必要があります。
例:
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 |
注:ビューAの一部のホストには、ビューBにIP /ポート関連の項目がない場合があります。
ビューAの一部のホストがビューBで一致する可能性もあります。
ビューAのすべてのエントリとビューBの正しい関連エントリを取得するには、LEFT JOINを使用する必要があると考えましたが、機能しませんでした。適切なWHERE句とJOINソリューションを使用してクエリを調整することはできません。
何か案が?
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
この方法を試してみましょう:
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