我需要从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
答案 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;
请记住,对于任何连接,条件非常重要,否则它只是另一个交叉连接,即每行与每隔一行的组合。