繁体   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