0

2 つのテーブルのそれぞれからいくつかの要素を取得して、postgresql データベースからいくつかのデータを抽出する必要があります。テーブルには、物理​​ネットワーク デバイスに関連するデータが含まれます。1 つのテーブルは、これらのデバイスの MAC アドレス専用です。各デバイスは、場所 (車両) と機能 (dev_name) によって識別されます。

table1 (資産):

vehicle
dev_name
dev_serial
dev_model

table2: (マック)

vehicle
dev_name
mac
interface

私が試したこと:

SELECT assets.vehicle, assets.dev_name, dev_model, dev_serial, mac
    FROM assets, macs
    AND interface = 'E0'
    ORDER BY vehicle, dev_name
;

しかし、思ったように車両とdev_nameが一致していないようです。代わりに、mac と dev_serial のすべての組み合わせを出力するように見えますが、これは意図した出力ではありません。それぞれに 1 行が必要です。

assets.dev_name = macs.dev_name および assets.vehicle = macs.vehicle に基づいて、MAC アドレスをデバイスに一致させるにはどうすればよいでしょうか?

注: の一部のデバイスにassetsは に記録された MAC アドレスがない場合がありmacます。

4

3 に答える 3

3

を使用するjoin場合、どの列を一致させる必要があるかを指定できます

SELECT a.vehicle, a.dev_name, dev_model, dev_serial, mac
FROM assets a
LEFT JOIN macs m ON m.vehicle = a.vehicle 
                 AND m.dev_name = a.dev_name
WHERE interface = 'E0'
ORDER BY a.vehicle, a.dev_name
于 2013-09-03T10:13:13.090 に答える
0

シンプルな結合キーワードがあなたの問題の解決策です

SELECT assets.vehicle, assets.dev_name, dev_model, dev_serial, mac
FROM assets A join macs M
ON A.dev_name = M.dev_name

それ以外の場合は、次のようにクエリを変更してください。

SELECT assets.vehicle, assets.dev_name, dev_model, dev_serial, mac
FROM assets, macs
WHERE interface = 'E0' AND assets.dev_name = macs.dev_name
ORDER BY vehicle, dev_name;

どの結合でも条件が非常に重要であることを覚えておいてください。そうしないと、別のクロス結合、つまり各行と他のすべての行の組み合わせになります。

于 2013-09-03T11:33:06.287 に答える
0

SQL joinについて読んでください。

select
   a.vehicle, a.dev_name, a.dev_model, a.dev_serial, m.mac
from assets as a
    inner join macs as m on m.dev_name = a.dev_name and m.vehicle = a.dev_name 
where m.interface = 'E0'
order by a.vehicle, a.dev_name

あなたの場合は内部結合ですが、すべてのアセットを取得し、インターフェイス E0 を持つものに対して mac を表示する場合は、左外部結合を使用できます。

select
   a.vehicle, a.dev_name, a.dev_model, a.dev_serial, m.mac
from assets as a
    left outer join macs as m on
        m.dev_name = a.dev_name and m.vehicle = a.dev_name and m.interface = 'E0'
order by a.vehicle, a.dev_name
于 2013-09-03T10:22:06.467 に答える