加入两个表

时间:2013-09-03 10:11:38

标签: sql database postgresql select join

我需要从postgresql数据库中提取一些数据,从两个tobles中的每一个中获取一些元素。这些表包含与物理网络设备相关的数据,其中一个表专门用于这些设备的mac地址。每个设备由位置(车辆)和功能(dev_name)标识。

table1(资产):

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
;

但它似乎不匹配车辆和dev_name,因为我认为它会。相反,它似乎打印mac和dev_serial的每个组合,这不是预期的输出,因为我想要每行一行。

如何根据assets.dev_name = macs.dev_name和assets.vehicle = macs.vehicle?确保它与设备的mac地址匹配?

注意:assets中的某些设备可能没有mac中记录的mac地址,在这种情况下我希望它们显示为空的mac

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,你可以使用left outer join

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

答案 2 :(得分: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;

请记住,对于任何连接,条件非常重要,否则它只是另一个交叉连接,即每行与每隔一行的组合。