簡體   English   中英

跨兩個表加入

[英]JOIN across two tables

我需要從postgresql數據庫中提取一些數據,並從兩個表中的每一個中獲取一些元素。 這些表包含與物理網絡設備有關的數據,其中一個表專門用於這些設備的mac地址。 每個設備均按位置(車輛)和功能(dev_name)標識。

表1(資產):

vehicle
dev_name
dev_serial
dev_model

table2:(macs)

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
;

但這似乎不符合我想的那樣匹配vehicle和dev_name。 相反,它似乎打印了mac和dev_serial的每種組合,這不是預期的輸出,因為我要為每一行輸出一行。

如何根據assets.dev_name = macs.dev_name和assets.vehicle = macs.vehicle確保它與設備的mac地址匹配?

注意: assets某些設備可能沒有在mac記錄的mac地址,在這種情況下,我希望無論如何它們都顯示為空的mac

使用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

了解有關SQL連接的信息

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

一個簡單的join關鍵字就是您解決問題的方法

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;

請記住,對於任何聯接而言,條件都非常重要,否則,它將變成另一個交叉聯接,即每行與每隔一行的組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM